代码之家  ›  专栏  ›  技术社区  ›  user3220058

成员函数回调c++14的Bind或Lambda

  •  2
  • user3220058  · 技术社区  · 7 年前

    任何帮助都将不胜感激,希望这个例子也能有所帮助。

    template<class T>
    void addCallBack(void(T::*someFunc)(int), T* instance) {
        func = std::bind(someFunc, instance, _1);
    }
    std::function<void(int)> func ;
    

    template<class T>
    void addCallBack(T* instance) {
        func = [&instance](int x) {
            instance->someFunc(x);
        }
    }
    std::function<void(int)> func;
    
    1 回复  |  直到 7 年前
        1
  •  5
  •   Barry    7 年前

    这:

    template<class T>
    void addCallBack(T* instance) {
        func = [&instance](int x) {
            instance->someFunc(x);
        }
    }
    

    正在捕获参数 instance 通过引用,在结束时超出范围 addCallBack() 所以你最终得到了一个悬而未决的参考。所以,当然

    你想做的是:

    func = [instance](int x){ instance->someFunc(x); }
    

    或者只是:

    func = [=](int x){ instance->someFunc(x); }
    

    在此期间:

    func = std::bind(&T::someFunc, instance, std::placeholders::_1);
    

    但是lambda通常更易于阅读(就像在本例中一样),更易于内联,并且更能够处理任意复杂的事情。在这种情况下,后两者并不重要,但基本上都是喜欢Lambda的好理由。


    当然,如果 someFunc 是一个重载名称,这是更喜欢lambda的另一个原因-它始终有效。