【问题标题】:Handling a C++ libsigc++ signal with a lambda function使用 lambda 函数处理 C++ libsigc++ 信号
【发布时间】:2011-05-13 15:19:51
【问题描述】:

我正在编写一些使用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++ 新手!

【问题讨论】:

  • 在最近接受的 C++0x 标准之前,C++ 不支持 lambda。而且 C++0X 太新了,我怀疑 libsigc++ 的编写方式是为了利用新的 lambdas
  • @aneccodeal,在this page 上,API 中有很多对术语lambda 的引用。他们实际上指的是别的东西吗?这对我来说有点胡言乱语,真的。
  • 看起来这是一个模板结构,他们定义的不是 C++0x lambda 函数。
  • @aneccodeal:C++0x lambda 可以在任何可以使用函数对象的地方使用。函数对象已经存在了一段时间。如果您编写的代码接受函数对象参数,则无需进行任何更改即可接受 lambda。
  • 我应该说,“如果您编写的代码接受任意函数对象参数*,也就是函数模板。如果您的函数只接受特定类的函数对象,它不会接受 lambda 作为替代品。

标签: c++ events signals libsigc++


【解决方案1】:

Lambda 只是函数对象。因此,在任何可以使用任意(即模板化)仿函数的地方,都可以使用 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;
}

附言

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

【讨论】:

  • sigc::slot 似乎是可选的。此代码适用于 gtkmm:auto quit = []() { Gtk::Main::quit(); }; button.signal_clicked().connect(quit);
  • button.signal_clicked().connect([this]{ /* 方法代码 */ });这是相当不错的。
【解决方案2】:

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

【讨论】:

  • 如果我错了,我不介意被 -1。不过,我想知道为什么那个 -1 的人认为我错了。
  • 不知道为什么会投反对票。我已经倾斜了天平。感谢您的信息。
【解决方案3】:

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

【讨论】:

  • 看到 OP 对 lambdas 来说是新手,我认为这是一个很好的机会,可以提供一个很好的资源,让他/她可以学习 lambdas 在 C++0x 中的工作方式。那么为什么这被否决了呢??
  • 我不知道。同样的事情发生在我身上。 :-/
  • 不知道为什么会投反对票。我已经倾斜了天平。感谢您的信息。
  • 谢谢,非常感谢 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多