8

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

我对 C++ 很陌生,我倾向于用 C# 来思考。我在 C# 中想要的等效代码类似于:

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

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

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

4

3 回答 3

6

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

附言

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

于 2011-05-13T16:17:57.990 回答
2

C++ 0x 支持 lambda,并且可能允许您执行类似于在 C# 中执行的操作。请参阅哪些 C++ 编译器已经支持 lambda?用于 C++0x 就绪的编译器。

于 2011-05-13T16:21:13.217 回答
0

MSDN 上的这个站点对lambda 功能以及autoC++0x 中关键字的使用进行了很好的布局和全面的了解。它有一些非常有用的示例,以及早期 C++ 版本中 lambda 和函数对象之间的联系。请注意,如果您使用的是 g++ 4.4 或更高版本,则可能必须使用-std=c++0xor1std=gnu++0x标志才能正确编译这些功能。

于 2011-05-13T16:19:16.510 回答