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

时间:2017-09-28 21:15:45

标签: c++ lambda c++14 bind

只是在新版本的c ++中查询哪个是更好的选择来处理成员函数的回调。 任何帮助都将非常感激,希望这个例子也会有所帮助。

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 个答案:

答案 0 :(得分:4)

此:

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通常更容易阅读(就像在这种情况下一样),并且更容易内联,并且更能够执行任意复杂的事情。后两者在这种情况下并不重要 - 但基本上总是喜欢lambdas是很好的理由。

当然,如果someFunc是一个重载名称,这不起作用,这是另一个更喜欢lambda的理由 - 这将永远有效。