处理C++;libsigc++;具有lambda函数的信号 我正在研究一些用于信令(EvoTest.E/P>)的C++代码。 我对C++很陌生,我倾向于用C语言来思考。与我在C#中想要的代码等效的代码如下: var names = new List<string>(); thing.Happened += (string name) => names.Add(name); thing.DoStuff(); var name=newlist(); thing.comed+=(字符串名称)=>names.Add(名称); DoStuff();

处理C++;libsigc++;具有lambda函数的信号 我正在研究一些用于信令(EvoTest.E/P>)的C++代码。 我对C++很陌生,我倾向于用C语言来思考。与我在C#中想要的代码等效的代码如下: var names = new List<string>(); thing.Happened += (string name) => names.Add(name); thing.DoStuff(); var name=newlist(); thing.comed+=(字符串名称)=>names.Add(名称); DoStuff();,c++,events,signals,libsigc++,C++,Events,Signals,Libsigc++,在演示如何将函数或成员绑定到信号方面,我做得很好,但我不想为这样一个简单的方法定义一个新的类级方法,至少在我看来,这个方法应该私下封装在它的客户机中 libsigc++API似乎支持lambda表达式,但我还没有找到任何示例来说明如何使用它们。有人能帮我吗?记住我是C++新手! lambda只是函数对象。因此,在任何可以使用任意(即模板化)函子的地方,都可以使用lambda 我没有安装库,因此无法测试此功能,但看看,我相信此修改应该可以工作: int main() { AlienDete

在演示如何将函数或成员绑定到信号方面,我做得很好,但我不想为这样一个简单的方法定义一个新的类级方法,至少在我看来,这个方法应该私下封装在它的客户机中


libsigc++API似乎支持lambda表达式,但我还没有找到任何示例来说明如何使用它们。有人能帮我吗?记住我是C++新手! lambda只是函数对象。因此,在任何可以使用任意(即模板化)函子的地方,都可以使用lambda

我没有安装库,因此无法测试此功能,但看看,我相信此修改应该可以工作:

int main()
{
    AlienDetector mydetector;
    auto warn_people = []() {
            cout << "There are aliens in the carpark!" << endl;
    };

    mydetector.signal_detected.connect( sigc::slot<void>(warn_people) );

    mydetector.run();

    return 0;
}
intmain()
{
AlienDetector-mydetector;
自动警告用户=[](){

CUT

对LAMBDA的特性有很好的布局和全面的了解,在C++ 0x中使用了 Auto <代码>关键字。它有一些非常有用的例子,以及早期版本的C++中的lambdas和函数对象之间的连接。注意,您可能必须使用<代码> -STD= C++ 0x或<代码> 1STD= GNU。如果你使用G+版本4.4或更大,以使这些特征正确编译。如果你在C语言中做了类似的事情,那么,你可以做一些类似于C++中的事情。对于C++的0x编译,直到最近接受的C++ 0x标准,C++不支持LAMBDAS。以这样一种方式写的,以利用新的lambdas@aneccodeal,在API中有许多对术语

lambda
的引用。它们实际上是指其他东西吗?这对我来说真的有点胡言乱语。看起来这是一个模板结构,他们定义的不是C++0x lambda函数。@anecodeal:C++0x lambda可以可以在任何可以使用函数对象的地方使用。函数对象已经存在了一段时间。如果您编写的代码接受函数对象参数,则无需进行任何更改即可接受lambdas。我应该说,"如果您编写的代码接受任意函数对象参数*,换句话说,就是函数模板。如果您的函数只接受特定类别的函数对象,它不会接受lambda作为替换。鉴于OP是lambdas的新成员,我认为这将是一个很好的机会,可以提供一个优秀的资源,让他/她能够d了解lambdas在C++0x中的工作原理。那么为什么会被否决?我不知道。同样的事情发生在我身上。:-/不知道为什么会被否决。我已经把天平倾斜了。谢谢你提供的信息。谢谢,非常感谢:)如果我错了,我不介意被-1否定。我想知道为什么-1是我的人认为我错了。不过,不知道为什么通过向下投票。我已经倾斜了天平。谢谢你的信息。sigc::slot似乎是可选的。这段代码在gtkmm中工作:
auto-quit=[](){Gtk::Main::quit();};button.signal_clicked().connect(quit);
按钮也是如此。signal_clicked().connect([This]{/*method code*/});这很好。