6

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

4

4 回答 4

6

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

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

可能看起来像这样:

myObject.AddHandler([&](int _) {
    // do something and access captured variables by reference
});
于 2012-04-05T17:45:35.807 回答
4

是否有任何 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 回调可能无关紧要。

于 2012-04-05T19:06:59.090 回答
2

有一个新的 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/

玩得开心!

于 2012-04-14T02:35:12.803 回答
0

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

于 2015-05-22T06:38:01.077 回答