只是在新版本的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;
答案 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的理由 - 这将永远有效。