【问题标题】:C++11 Lambda Expressions as Callback FunctionsC++11 Lambda 表达式作为回调函数
【发布时间】:2012-04-05 17:26:42
【问题描述】:

是否有任何 C++ GUI 工具包支持将回调函数定义为 C++11 lambda 表达式?我相信这是使用 C#(至少与 C++ 相比)编写基于 GUI 的程序的独特优势。对于将 lambda 表达式作为参数的函数,我应该使用什么类型签名以及这些函数如何支持隐式转换?

【问题讨论】:

  • 查看 any 信号/插槽库,例如 this、this 或 this。这种模式与 GUI 完全正交,但 GUI 是该模式常用的地方。

标签: c++ user-interface lambda callback c++11


【解决方案1】:

问题第二部分的答案:您可以使用std::function<Signature> where Signature = e.g. void (int) 或 - 如果 lambda 不采用闭包 - 旧的 void (Foo*)(int) 方法,因为没有闭包的 lambda 必须可转换为正确的函数类型。因此,例如调用带有签名的方法:

void AddHandler(std::function<void (int)> const &);

可能看起来像这样:

myObject.AddHandler([&](int _) {
    // do something and access captured variables by reference
});

【讨论】:

    【解决方案2】:

    是否有任何 C++ GUI 工具包支持将回调函数定义为 C++11 lambda 表达式?

    如果它们接受函数指针,那么您至少可以使用不捕获任何内容的 lambda。这样的 lambda 可以自动转换为函数指针。

    对于以 lambda 表达式作为参数的函数,我应该使用什么类型签名,这些签名如何支持隐式转换?

    如果您希望人们使用 lambdas 或任何可调用对象,那么您可以让您的 API 接受 std::function 对象,或者使用模板:

    template<typename Callback>
    void do_it(Callback c) {
        c();
    }
    
    do_it([&]{ c = a+b; });
    

    模板将允许内联 lambda,而 std::function 需要间接。这对于 GUI 回调可能无关紧要。

    【讨论】:

    • 请避免使用二合字母
    【解决方案3】:

    有一个新的 GUI 工具包可以满足您的要求。它正在尝试提供许多功能来提高开发效率。

    图书馆简介。 http://nanaproject.wordpress.com/2011/12/16/preliminary-study-of-nana-c-library/

    一篇解释如何通过同时使用库和 std::bind 来降低复杂性的文章。 http://nanaproject.wordpress.com/2012/01/31/idioms-and-insights-for-a-good-design/

    玩得开心!

    【讨论】:

      【解决方案4】:

      使用 C++11 模板库,GUI 是否支持 lambda 并不重要。您可以使 GUI 对消息执行任何操作,并在域逻辑端保留相同的代码。查看这篇关于taming Qt 和这些examples 的文章。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-11
        • 2014-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多