压缩 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)
}

关于此的一些说明:

  1. 正如 Mirko 已经正确提到的那样,调用非静态成员函数与调用静态成员函数基本相同,其中 this 作为隐式第一个参数。 struct A 的实例作为第一个参数的绑定利用了这一事实。
  2. 使用 auto 的类型推断确实适用于没有任何参数的成员函数,但不适用于上述情况。
  3. 如果非静态成员函数被重载(例如 std::vector<T>::push_back),您必须显式声明函数模板的模板参数 std::bind。请参阅 将 std::tr1::bind 与 std::vector::push_back 结合使用 Are there boost::bind issues with VS2010? 了解更多信息。