传递函数作为另一个函数的参数 c++ 11

问题描述 投票:0回答:1

我在 c++11 中有这段代码

// To register a callback
void registerCallback(void (*fnPtr)(int state)) {
}

class Test {
public:
    // To pass in the callback
    void helloTest(int state) {   
    }

    void registerTheCallbackHere()
    {
        // This does not pass ( I want to it to pass)
        auto lamda = [this](int state) {
            this->helloTest(state);
        };
        registerCallback(lamda); // error here

        // But this one pass 
        auto lamda2 = [](int state) {
        };
        registerCallback(lamda2); // no error
    }
};

我有一个回调函数作为参数的函数,称为 registerCallback。 我有一个测试类,它有一个方法“helloTest”。我想使用 lamda 函数将此方法传递给测试类的另一个名为 registerTheCallbackHere 的方法中的 register 回调,但它不起作用。 你能帮忙提供一个替代解决方案吗?

c++ c++11 callback
1个回答
0
投票

只有无捕获的 lambda 可以绑定到您的 registerCallback 函数的参数,但是如果您可以修改 registerCallback 函数,那么您可以使用 std::function:

#include <functional>

void registerCallback(std::function<void(int)> fnPtr) { }

(我按值传递,但您可以决定按引用传递。)

未来可能出现的问题:

  • 您不能将仅移动的 lambda 传递给 std::function,因此您不能在 lambda 捕获中捕获 unique_ptr。
    • 解决方案一:shared_ptr
    • 解决方案 2:c++23 std::move_only_function
  • lambdas 默认是不可变的(这是你应该喜欢的)
    • 如果你想改变它的状态(捕获成员的状态),你可能必须声明你的 lambda 可变
© www.soinside.com 2019 - 2024. All rights reserved.