Dan*_*ien 16 c c++ lambda c++11
昨天我在考虑是否可以使用C++ 0x lambda函数的便利来为Windows API函数编写回调.
例如,如果我想将lambda用作EnumChildProcwith ,该EnumChildWindows怎么办?就像是:
EnumChildWindows(hTrayWnd, CALLBACK [](HWND hWnd, LPARAM lParam) {
// ...
return static_cast<BOOL>(TRUE); // continue enumerating
}, reinterpret_cast<LPARAM>(&myData));
Run Code Online (Sandbox Code Playgroud)
另一个用途是extern "C"为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;
}));
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我可以理解捕获变量的lambdas永远不会与C兼容,但至少对我来说似乎可以捕获 - 没有任何 lambda可以兼容.
Joh*_*itb 14
没有捕获的Lambda 可以隐式转换为指向函数的指针(通过闭包类型定义的非显式转换函数).
FCD似乎没有指定该函数指针类型的函数类型具有哪种语言链接,因此如果需要将此函数指针传递给C函数,则C++函数和C函数的调用约定必须相同.我相信在Windows上,情况确实如此.所以你应该能够将lambda传递给Windows API函数
typedef void(*callbackType)(void *userData);
extern "C" void someCFunction(callbackType callback);
int main() {
someCFunction([](void *userData) { /* ... */ });
}
Run Code Online (Sandbox Code Playgroud)
FCD措辞5.1.2/6:
没有lambda-capture的lambda表达式的闭包类型有一个公共的非虚拟非显式const转换函数,用于指向具有与闭包类型的函数调用操作符相同的参数和返回类型的函数.此转换函数返回的值应为函数的地址,该函数在调用时具有与调用闭包类型的函数调用运算符相同的效果.
我认为最终的标准应该有一个说明,即C语言链接函数指针和C++链接函数指针都有转换函数,因为转换为C函数指针是此功能的目标之一.
| 归档时间: |
|
| 查看次数: |
2165 次 |
| 最近记录: |