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

标签 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;

最佳答案

这个:

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/

相关文章:

c++ - 如果多个数字重复相同次数,我需要输出 "no mode"

c++ - 用 iota 初始化一个 unique_ptr 的容器

c# - AutoMapper Project().To<T> 和可重用的 lambda 表达式

Java 8 将 Map<Integer, List<String>> 转换为 Map<String, List<Integer>>

javascript - Lambda 函数返回具有不同内存位置的函数?

带有可选参数的 C++ 构造函数

c++ - glsl 蒙皮障碍,谁能跳过那个?

c++14 通过引用返回一个值以优化性能

c++ - 标准容器封装和基于范围的 for 循环

基于 C++ 模板参数的编译