gpt4 book ai didi

c++ - 成员函数回调的绑定(bind)或 Lambda c++14

转载 作者:行者123 更新时间:2023-11-30 01:39:07 25 4
gpt4 key购买 nike

只是询问在较新版本的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com