C++定义一个使用lambda闭包的函数
C++ Defining a function which works with lambda closures
我在计算lambda函数定义时遇到问题。所以我有这个代码,它工作正常:
auto fnClickHandler = [](Button *button) -> void
{
cout << "click" << endl;
};
button->setEventHandler(MOUSEBUTTONUP, fnClickHandler);
然而,我需要在fnClickHandler中使用闭包,所以我执行以下代码:
int someParam = 1;
auto fnClickHandler = [someParam](Button *button) -> void
{
cout << "click" << someParam << endl;
};
button->setEventHandler(MOUSEBUTTONUP, fnClickHandler);
现在我得到以下编译错误:
no matching function for call to ‘Button::setEventHandler(BUTTON_EVENT_HANDLERS, nameOfFunctionWhichHostsThisCode::__lambda0&)’|
Button::setEventHandler函数就是这样定义的:
void setEventHandler(int, void (*handler)(Button *));
我想我需要更改该定义以支持lambda闭包参数(可选),但到目前为止我还是失败了。你能帮我弄清楚吗?
谢谢!
无捕获的lambda可以隐式转换为具有相同签名的函数指针。这就是为什么您的代码使用fnClickHandler
的无捕获版本。一旦你有了一个捕获lambda,你就有两个选择:
-
创建一个函数模板,让编译器为您推导的类型
template <typename Handler> void setEventHandler(int, Handler handler);//You can use either enable_if or static_assert to restrict the types of Handler.
-
使用
std::function
:void setEventHandler(int, std::function<void(Button *)>);
相关文章:
- 如何使用类模拟 C++11 中的 lambda 函数和闭包?
- 使用带有闭包的 lambda 的回调
- C++中的 Lambda <-> 闭包等价性
- Lambda闭包左值可以作为右值参考参数传递
- 关于函数模板中定义的 lambda 闭包类型可以说些什么?
- Lambda 表达式闭包函数不起作用
- Lambda 闭包类型构造函数
- 当另一个调用 lambda 使用默认捕获时,lambda 的闭包可能会被破坏吗?
- c++11 lambda 真的支持闭包吗?函数变量中存在语义冲突
- 在 lambda 闭包中复制的 const 对象不可变
- 如何将局部引用的变量传递给 lambda 函数,但该函数将在闭包完成后调用
- C++11 Lambda闭包通过引用涉及一个堆栈变量,该变量离开作用域是允许的,但得到了未定义的行为
- C++定义一个使用lambda闭包的函数
- 在 lambda 闭包上应用移动
- 在 C++11 lambda 语法中,堆分配的闭包
- 从函数返回的 C++ lambda 闭包类型
- 通过MPI发送Lambda闭包
- 了解Lambda闭包类型如何删除默认构造函数
- c++编译器会对lambda闭包执行编译时优化吗?
- 给定一个lambda捕获,哪些规则决定结果闭包成员的类型