热处理 c++11 lambda,同时捕获此指针并指定调用约定

Hot to handle c++11 lambda with both this pointer captured and calling convention specified

本文关键字:指针 约定 调用 lambda c++11 热处理      更新时间:2023-10-16
使用

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)时,你不再有这种能力了。