将C ++ Lambda存储在成员变量中以用作回调?

时间:2013-10-27 18:42:07

标签: c++ lambda callback member-variables

我正在尝试实现一个将Lambda回调作为参数的c ++函数。问题是,回调是从同一个(被调用的)类中的另一个函数异步启动的。因此,我需要将Lambda存储在一个成员变量中,以便可以通过需要启动回调的异步函数来访问它。

我尝试了所有我能想到的方法来使用成员变量声明,设置和调用Lambda,但代码总是在赋值或调用中崩溃。

这是我正在尝试做的一个精简版本。

声明功能:

void function(const std::function<void()>callback);

从主代码中调用该函数:

myClass->function([](){cout << "Callback called";});

如果我从callback内执行function它工作正常,但我找不到将其存储在成员变量(例如m_callback)中并从另一个变量调用它的方法同一类的功能。

2 个答案:

答案 0 :(得分:5)

这应该有效:

#include <functional>
#include <utility>

struct MyThing
{
    std::function<void()> f_;

    void SetCallback(std::function<void()> f) { f_ = std::move(f); }

    void Action() { f_(); }
};

用法:

#include <iostream>

MyThing thing;

thing.SetCallback([](){ std::cout << "Boo\n"; });
thing.Action();

答案 1 :(得分:1)

只需创建一个std :: function变量,然后调用它。

#include <iostream>
#include <functional>

struct A{
    std::function<void()> cb;

    void function(const std::function<void()>callback){
        cb=callback;
    }
};

int main() {
    A a;

    a.function([](){std::cout << "Callback called";});

    a.cb();

}