只是询问在较新版本的 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;
最佳答案
这个:
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 的又一个原因 - 它将始终有效。
关于c++ - 成员函数回调的绑定(bind)或 Lambda c++14,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46478438/