1

在 VC2012 中,当 lambda 函数在没有捕获列表的情况下使用时,编译器将自动处理调用约定。例如

EnumWindows([](HWND, LPARAM){ return TRUE; }, 0); // compile with no problem

但是当我把这个指针指向捕获列表时,它编译失败。例如

EnumWindows([this](HWND, LPARAM){ return my_class_member_function(); }, 0); // error

有人可以告诉我是否有办法在 lambda 函数中调用成员函数?

谢谢, 迈尔斯

4

3 回答 3

5

只有不捕获任何内容的 lambda 可以转换为函数指针,并且此 API 只接受指针。

您可以做的是保持 lambda 无状态,并this通过以下方式传输lparam

EnumWindows(
         [](HWND, LPARAM lparam){
             return reinterpret_cast<Your_Class*>(lparam)->my_class_member_function();
         },
         reinterpret_cast<LPARAM>(this));
于 2013-10-20T09:02:34.680 回答
2

问题不在于调用约定。问题是捕获 lambdas 不提供到函数指针的转换,所以你不能传递这样的 lambda 函数指针。

于 2013-10-20T09:00:18.687 回答
1

只有无状态的 lambda 函数可以衰减为函数指针。当您添加状态(通过捕获this)时,您不再具有此能力。

于 2013-10-20T08:59:06.040 回答