C++ 11 Lambda表达式作为回调函数

Nor*_*löw 6 c++ lambda user-interface callback c++11

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

Pau*_*lik 6

对问题第二部分的回答:你可以使用std::function<Signature>where Signature= eg void (int)或 - 如果lambda不接受闭包 - 这是一个很好的旧void (Foo*)(int)方法,因为没有闭包的lambda必须可以转换为正确的函数类型.因此,例如调用带签名的方法:

void AddHandler(std::function<void (int)> const &);
Run Code Online (Sandbox Code Playgroud)

可能看起来像这样:

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


bam*_*s53 5

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

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

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

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

template<typename Callback>
void do_it(Callback c) {
    c();
}

do_it([&]{ c = a+b; });
Run Code Online (Sandbox Code Playgroud)

模板允许内联 lambda,而 std::function 需要间接。这对于 GUI 回调来说可能并不重要。