是否有任何 C++ GUI 工具包支持将回调函数定义为 C++11 lambda 表达式?我相信这是使用 C#(至少与 C++ 相比)编写基于 GUI 的程序的独特优势。对于将 lambda 表达式作为参数的函数,我应该使用什么类型签名,这些签名如何支持隐式转换?
4 回答
问题第二部分的答案:您可以使用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
});
是否有任何 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 回调可能无关紧要。
有一个新的 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/
玩得开心!