热处理 c++11 lambda,同时捕获此指针并指定调用约定
Hot to handle c++11 lambda with both this pointer captured and calling convention specified
使用
VC2012,当在没有捕获列表的情况下使用 lambda 函数时,编译器将自动处理调用约定。例如
EnumWindows([](HWND, LPARAM){ return TRUE; }, 0); // compile with no problem
但是当我把这个指针放在捕获列表上时,它编译失败了。例如
EnumWindows([this](HWND, LPARAM){ return my_class_member_function(); }, 0); // error
有人可以让我知道是否有办法在 lambda 函数中调用成员函数吗?
谢谢,迈尔斯
只有不捕获任何内容的 lambda 才能转换为函数指针,并且此 API 仅接受指针。
您可以做的是使 lambda 保持无状态,并通过 lparam
传输this
:
EnumWindows(
[](HWND, LPARAM lparam){
return reinterpret_cast<Your_Class*>(lparam)->my_class_member_function();
},
reinterpret_cast<LPARAM>(this));
问题不在于调用约定。问题在于捕获 lambda 不提供到函数指针的转换,因此您不能在需要指向函数的指针的地方传递这样的 lambda。
只有无状态的lambda函数可以衰减到函数指针。当你添加了状态(通过捕获this
)时,你不再有这种能力了。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- C++关于传递对象(指针与引用)的约定
- 热处理 c++11 lambda,同时捕获此指针并指定调用约定
- 指针的两种不同语法约定
- 指针和const的C/ c++约定
- c++约定:这个指针