使用lambda函数处理C ++ libsigc ++信号

时间:2011-05-13 15:19:52

标签: c++ events signals libsigc++

我正在研究一些使用libsigc++进行信令(事件)的C ++代码。

我对C ++很陌生,我倾向于用C#思考。我在C#中想要的等价代码就像:

var names = new List<string>();
thing.Happened += (string name) => names.Add(name);
thing.DoStuff();

libsigc++ tutorials很好地展示了如何将函数或成员绑定到信号,但是我不想为这样一个真正应该私有的简单方法定义一个新的类级方法封装在其客户端内,至少在我的想法中。

libsigc ++ API似乎支持lambda表达式,但我没有找到任何显示如何使用它们的示例。有人可以帮我吗?请记住,我是一个C ++新手!

3 个答案:

答案 0 :(得分:6)

Lambdas只是函数对象。因此,在任何可以使用任意(即模板化)函子的地方,都可以使用lambda。

我没有安装库,所以我无法测试,但是看this example,我相信这个修改应该有效:

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;
}

<强> P.S。

我对这个答案并不完全有信心,因为我无法测试它。我在文档中找到了slot类的构造函数,因为我从未在类模板中遇到构造函数模板,所以我不确定这些类型是否都能解析。所以无论如何,我只使用标准库编写了一个测试,它做了类似于构造函数的工作,并且它有效。 Here it is

答案 1 :(得分:1)

C++ 0x supports lambdas并且可能允许你做类似于你在C#中做的事情。 See What C++ compilers are supporting lambda already?用于C ++ 0x ready编译器。

答案 2 :(得分:0)

This site on MSDN对lambda特性以及在C ++ 0x中使用auto关键字有一个非常好的布局和全面的看法。它有一些非常有用的示例,以及早期版本的C ++中lambdas和函数对象之间的连接。请注意,如果您使用的是g ++ 4.4或更高版本,则可能必须使用-std=c++0x1std=gnu++0x标志才能正确编译这些功能。