我正在编写一些使用libsigc++进行信令(事件)的C++代码。
我对C++还很陌生,而且我倾向于用C#来思考。我希望在C#中使用的等效代码如下所示:
var names = new List<string>();
thing.Happened += (string name) => names.Add(name);
thing.DoStuff();libsigc++ tutorials很好地展示了如何将函数或成员绑定到信号,但我不想为这样一个简单方法定义一个新的类级方法,该方法实际上应该以私有方式封装在其客户端中,至少在我看来是这样。
lambda API似乎支持libsigc++表达式,但我还没有找到任何示例来说明如何使用它们。有人能帮帮我吗?请记住,我是C++新手!
发布于 2011-05-14 00:17:58
Lambda只是函数对象。因此,在任何可以使用任意(即模板化) functor的地方,都可以使用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
发布于 2011-05-14 00:21:13
C++ 0x supports lambdas,可能会允许你做一些类似于你在C#中做的事情。用于C++0x ready编译器的See What C++ compilers are supporting lambda already?。
发布于 2011-05-14 00:19:17
This site on MSDN对lambda特性以及auto关键字在C++0x中的使用有一个非常好的布局和全面的介绍。它有一些非常有用的示例,以及lambdas和C++早期版本中的函数对象之间的连接。请注意,如果您使用的是g++版本4.4或更高版本,则可能必须使用-std=c++0x或1std=gnu++0x标志才能正确编译这些功能。
https://stackoverflow.com/questions/5994101
复制相似问题