【发布时间】:2010-05-29 13:18:00
【问题描述】:
昨天我在考虑是否可以利用 C++0x lambda 函数的便利性来为 Windows API 函数编写回调。
例如,如果我想将 lambda 用作 EnumChildProc 和 EnumChildWindows 怎么办?比如:
EnumChildWindows(hTrayWnd, CALLBACK [](HWND hWnd, LPARAM lParam) {
// ...
return static_cast<BOOL>(TRUE); // continue enumerating
}, reinterpret_cast<LPARAM>(&myData));
另一个用途是为 C 例程编写 extern "C" 回调。例如:
my_class *pRes = static_cast<my_class*>(bsearch(&key, myClassObjectsArr, myClassObjectsArr_size, sizeof(my_class), extern "C" [](const void *pV1, const void *pV2) {
const my_class& o1 = *static_cast<const my_class*>(pV1);
const my_class& o2 = *static_cast<const my_class*>(pV2);
int res;
// ...
return res;
}));
这可能吗?
我可以理解捕获变量的 lambda 永远不会与 C 兼容,但至少在我看来 capture-nothing lambda 可以兼容。
【问题讨论】:
-
这在针对 C++11 标准的缺陷报告中得到了澄清,正如我在下面的回答中所解释的那样。