代码之家  ›  专栏  ›  技术社区  ›  Michael Choi Peter Alexander

紧凑型C++函数调用语法

  •  1
  • Michael Choi Peter Alexander  · 技术社区  · 7 年前

    我想减少引用函数所需的语法量,并想知道是否有一种方法可以执行以下操作:

    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
    

    但我不想使用宏。

    4 回复  |  直到 7 年前
        1
  •  6
  •   François Andrieux    7 年前

    #include <vector>
    
    void foo(std::vector<int> & bar)
    {
        auto pushToLastUsed = [&bar](int index) {
            bar.push_back(index);
        };
    
        pushToLastUsed(10);
    }
    

    bar 具有很长的标识符。

        2
  •  2
  •   463035818_is_not_an_ai    7 年前

    我的第一个想法与另一个答案大致相同。再次阅读您的问题后,我了解到您希望避免重复的主要是对象的长名称。隐藏对标准函数的调用应该小心,因为它的主要作用是混淆代码。大家都知道什么 push_back 是的,但即使是你也可能会忘记到底是什么 pushToLastUse mSomeLongStackFIFOObject

    auto& short_name = mSomeLongStackFIFIObject;
    short_name.push_back(10);
    
        3
  •  1
  •   Mirko    7 年前

    当你写作的时候 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); }
    

    如果您试图缩短访问时间,我可以猜您不止一次地使用该变量;然后它 能够 尝试将所有访问放在属于该类的函数中是有意义的。

        4
  •  1
  •   dtell    7 年前

    您可以通过绑定对象来实现所需的行为 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 . 看见 Using std::tr1::bind with std::vector::push_back Are there boost::bind issues with VS2010? 以获取更多信息。