暂时解决 Visual Studio 2013 RTM 无法将嵌套 lambda 函数自动转换为 stdcall 的问题

VS2013 RTM 对于嵌套 lambda 支持不是很好,若希望转为 API 的 stdcall 形式,会出现编译错误。

例如:

::EnumWindows([](HWND hWnd, LPARAM lParam) {
    ::EnumChildWindows(hWnd, [](HWND hWndChild, LPARAM lParam) {
        return TRUE;
    }, NULL);
	
    return TRUE;
}, NULL);

编译这段代码会报错:

error C2664: “BOOL EnumChildWindows(HWND,WNDENUMPROC,LPARAM)”: 无法将参数 2 从“int (__cdecl *)(HWND,LPARAM)”转换为“WNDENUMPROC”

将里层 lambda 暂存到一个 stdcall 的函数指针里,可以暂时解决问题。

::EnumWindows([](HWND hWnd, LPARAM lParam) {
    WNDENUMPROC callback = [](HWND hWndChild, LPARAM lParam) {
        return TRUE;
    };

    ::EnumChildWindows(hWnd, callback, NULL);

    return TRUE;
}, NULL);