Gestern habe ich darüber nachgedacht, ob es möglich wäre, den Komfort von C++ 0x Lambda-Funktionen zu verwenden, um Callbacks für Windows-API-Funktionen zu schreiben.Unterstützt C++ 0x __stdcall oder extern "C" capture-nothing lambdas?
Zum Beispiel, was, wenn ich ein Lambda als EnumChildProc
mit EnumChildWindows
verwenden wollte? Etwas wie:
EnumChildWindows(hTrayWnd, CALLBACK [](HWND hWnd, LPARAM lParam) {
// ...
return static_cast<BOOL>(TRUE); // continue enumerating
}, reinterpret_cast<LPARAM>(&myData));
Eine weitere Anwendung wäre extern "C"
Rückrufe für C-Routinen zu schreiben. Zum Beispiel:
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;
}));
Ist das möglich?
Ich kann verstehen, dass Lambdas, die Variablen erfassen, nie mit C kompatibel sein werden, aber es scheint zumindest möglich, dass capture-nothing lambdas kompatibel sein kann.
Dies wurde in einem Fehlerbericht gegen den C++ 11-Standard geklärt, wie ich in meiner Antwort unten erläutere. –