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

存储C++;要用作回调的成员变量中的Lambda? 我尝试实现一个C++函数,它将lambda回调作为参数。问题是,回调是从同一(被调用)类中的另一个函数异步启动的。因此,我需要将Lambda存储在一个成员变量中,以便需要启动回调的异步函数可以访问它,c++,lambda,callback,member-variables,C++,Lambda,Callback,Member Variables,我尝试了所有我能想到的方法,使用成员变量声明、设置和调用Lambda,但是代码总是在赋值或调用中崩溃 这是我想做的一个精简版本 声明函数: void function(const std::function<void()>callback); void函数(const std::functioncallback); 从主代码调用函数: myClass->function([](){cout << "Callback called";}); myClass->f

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

这是我想做的一个精简版本

声明函数:

void function(const std::function<void()>callback);
void函数(const std::functioncallback);
从主代码调用函数:

myClass->function([](){cout << "Callback called";});
myClass->function([](){cout这应该可以:

#include <functional>
#include <utility>

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

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

    void Action() { f_(); }
};
#包括
#包括
结构神话
{
std::函数f;
void SetCallback(std::function f){f_u=std::move(f);}
无效操作(){f_u();}
};
用法:

#include <iostream>

MyThing thing;

thing.SetCallback([](){ std::cout << "Boo\n"; });
thing.Action();
#包括
虚构的事物;

SetCallback([]){std::cout只需创建一个std::函数变量,并调用它

#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();

}
#包括
#包括
结构A{
std::函数cb;
void函数(const std::functioncallback){
cb=回调;
}
};
int main(){
A A;

a、 函数([])({std::cout我试过了吗。当我在异步函数中调用cb时,我得到了一个SIGSEGV(main当然仍然处于活动状态)。这在Xcode和Eclipse中都会发生。@AmiramStark和哪个编译器?异步函数是什么意思?在Xcode中它是Apple LLVM 4.2。在Eclipse中它是最新的内置GCC编译器,我不知道版本。至于异步函数,我在最初的问题中解释过。从作为参数传递给的函数。但我需要将其存储在类成员变量中,并从另一个函数异步调用它(例如,当用户触摸按钮或超时回调时)@AmiramStark如果上面的代码不起作用,这是你的编译器的问题。如果它起作用,那么问题就出在其他地方。我很难相信两个不同的编译器有完全相同的问题,并且显示完全相同的错误(如我所说,您的代码在原始函数中工作,但如果我尝试在同一类中的异步函数中调用cb,则会失败)。当Lambda如您的示例中所示以内联方式定义时,这一点很好(即使在第二个异步函数中也是如此)。但如果Lambda是传递给函数的参数,则thing.Action()只在函数本身中起作用。它会导致异步函数中的EXC_BAD_访问。@AmiramStark:您的问题几乎肯定是由于对对象生命周期和同步的不完全理解。但是,如果没有一个更具代表性的示例来说明您正在尝试做什么,那么很难给出除此之外的任何建议恐怕是“写正确的代码”。