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);
好方法……
我去,这差点没看懂。lambda要是真这样用,还不如写个命名函数来的方便。
话说windows开发也有各种好处,起码不用考虑编译器是不是支持lambda。。。
是不是VS越来越不好用了。
ps:才发现你这个blog。