压缩 C++ 函数调用语法
Compactify C++ function calling syntax
我想减少引用函数所需的语法数量,想知道是否有办法执行类似的操作:
(不可编译)
using pushToLastUsed = mSomeLongStackFIFOObject.push_back;
// or
auto pushToLastUsed = mSomeLongStackFIFOObject.push_back;
然后我可以这样:
pushToLastUsed(10);
而不是:
mSomeLongStackFIFOObject.push_back(10);
当然我可以制作一个像这样的宏:
#define pushToLastUsed mSomeLongStackFIFOObject.push_back
// some code using it here
#undef pushToLastUsed
但我不想使用宏。
一种解决方案可能是使用 lambda 表达式将函数调用捕获到可调用对象中:
#include <vector>
void foo(std::vector<int> & bar)
{
auto pushToLastUsed = [&bar](int index) {
bar.push_back(index);
};
pushToLastUsed(10);
}
虽然在我看来这样做几乎没有什么好处,即使你用很长的标识符替换 bar
。
我的第一个想法与其他答案类似。在第二次阅读您的问题时,我了解到您要避免重复的主要是对象的长名称。隐藏对标准函数的调用应该小心,因为它的主要作用是混淆你的代码。每个人都知道 push_back
的作用,但即使您也可能会忘记 pushToLastUse
到底是做什么的。另一种选择是仅使用更短的名称为 mSomeLongStackFIFOObject
添加别名,如
auto& short_name = mSomeLongStackFIFIObject;
short_name.push_back(10);
当你写 mSomeLongStackFIFOObject.push_back(10);
你实际上是在调用 SomeLongStackFIFOClass::push_back(&mSomeLongStackFIFOObject, 10);
一个选项是:
auto& m= mSomeLongStackFIFOObject;
然后:
m.push_back(10);
它会缩短它,并且仍然允许您使用您喜欢的任何变量。
如果变量是全局的,你总是可以这样做:
static inline void pushBack(int n) { mSomeLongStackFIFOObject.push_back(n); }
如果你想缩短访问时间,我猜你不止一次使用了这个变量;那么 可以 尝试将所有访问放在属于 class.
的函数中是有意义的
您可以通过将对象 mSomeLongStackFIFOObject
绑定到成员函数 push_back
并为其参数使用占位符来实现所需的行为。这至少需要一个 C++11 编译器。
考虑以下示例:
#include <functional>
#include <iostream>
struct A {
void push_back(const int& n) { std::cout << "push_back(" << n << ")\n"; }
};
int main() {
A mSomeLongStackFIFOObject;
std::function<void(const int&)> pushToLastUsed = std::bind(
&A::push_back,
&mSomeLongStackFIFOObject,
std::placeholders::_1
);
pushToLastUsed(10); // push_back(10)
}
关于此的一些说明:
- 正如 Mirko 已经正确提到的那样,调用非静态成员函数与调用静态成员函数基本相同,其中
this
作为隐式第一个参数。 struct A
的实例作为第一个参数的绑定利用了这一事实。
- 使用
auto
的类型推断确实适用于没有任何参数的成员函数,但不适用于上述情况。
- 如果非静态成员函数被重载(例如
std::vector<T>::push_back
),您必须显式声明函数模板的模板参数 std::bind
。请参阅 将 std::tr1::bind 与 std::vector::push_back 结合使用
或 Are there boost::bind issues with VS2010? 了解更多信息。
我想减少引用函数所需的语法数量,想知道是否有办法执行类似的操作:
(不可编译)
using pushToLastUsed = mSomeLongStackFIFOObject.push_back;
// or
auto pushToLastUsed = mSomeLongStackFIFOObject.push_back;
然后我可以这样:
pushToLastUsed(10);
而不是:
mSomeLongStackFIFOObject.push_back(10);
当然我可以制作一个像这样的宏:
#define pushToLastUsed mSomeLongStackFIFOObject.push_back
// some code using it here
#undef pushToLastUsed
但我不想使用宏。
一种解决方案可能是使用 lambda 表达式将函数调用捕获到可调用对象中:
#include <vector>
void foo(std::vector<int> & bar)
{
auto pushToLastUsed = [&bar](int index) {
bar.push_back(index);
};
pushToLastUsed(10);
}
虽然在我看来这样做几乎没有什么好处,即使你用很长的标识符替换 bar
。
我的第一个想法与其他答案类似。在第二次阅读您的问题时,我了解到您要避免重复的主要是对象的长名称。隐藏对标准函数的调用应该小心,因为它的主要作用是混淆你的代码。每个人都知道 push_back
的作用,但即使您也可能会忘记 pushToLastUse
到底是做什么的。另一种选择是仅使用更短的名称为 mSomeLongStackFIFOObject
添加别名,如
auto& short_name = mSomeLongStackFIFIObject;
short_name.push_back(10);
当你写 mSomeLongStackFIFOObject.push_back(10);
你实际上是在调用 SomeLongStackFIFOClass::push_back(&mSomeLongStackFIFOObject, 10);
一个选项是:
auto& m= mSomeLongStackFIFOObject;
然后:
m.push_back(10);
它会缩短它,并且仍然允许您使用您喜欢的任何变量。
如果变量是全局的,你总是可以这样做:
static inline void pushBack(int n) { mSomeLongStackFIFOObject.push_back(n); }
如果你想缩短访问时间,我猜你不止一次使用了这个变量;那么 可以 尝试将所有访问放在属于 class.
的函数中是有意义的您可以通过将对象 mSomeLongStackFIFOObject
绑定到成员函数 push_back
并为其参数使用占位符来实现所需的行为。这至少需要一个 C++11 编译器。
考虑以下示例:
#include <functional>
#include <iostream>
struct A {
void push_back(const int& n) { std::cout << "push_back(" << n << ")\n"; }
};
int main() {
A mSomeLongStackFIFOObject;
std::function<void(const int&)> pushToLastUsed = std::bind(
&A::push_back,
&mSomeLongStackFIFOObject,
std::placeholders::_1
);
pushToLastUsed(10); // push_back(10)
}
关于此的一些说明:
- 正如 Mirko 已经正确提到的那样,调用非静态成员函数与调用静态成员函数基本相同,其中
this
作为隐式第一个参数。struct A
的实例作为第一个参数的绑定利用了这一事实。 - 使用
auto
的类型推断确实适用于没有任何参数的成员函数,但不适用于上述情况。 - 如果非静态成员函数被重载(例如
std::vector<T>::push_back
),您必须显式声明函数模板的模板参数std::bind
。请参阅 将 std::tr1::bind 与 std::vector::push_back 结合使用 或 Are there boost::bind issues with VS2010? 了解更多信息。