Używam biblioteki C w projekcie C++ 11, a biblioteka C udostępnia funkcję, która oczekuje wskaźnika funkcji. Chcę przekazać mu lambdę C++ 11, która działa poprawnie, chyba że przechwycę zmienne. Oto krótki przykład:Przekazywanie lambd z przechwytywaniem do starszych callbacków
#include <cstdio>
#include <functional>
typedef int (*Callback)();
void legacy(Callback callback) {
printf("%i\n", callback());
}
int stdCallback() {
return 1;
}
int main(int argc, char* argv[]) {
int number = 3;
// Standard C callback works
legacy(stdCallback);
// Lambda without capturing works
legacy([]() { return 2; });
// Lambda with capturing doesn't work
legacy([&]() { return number; });
return 0;
}
GNU kompilator C++ daje mi następujący komunikat o błędzie w trzecim wywołaniu funkcji legacy
:
test.cpp: In function ‘int main(int, char**)’:
test.cpp:24:36: error: cannot convert ‘main(int, char**)::<lambda()>’ to ‘Callback {aka int (*)()}’ for argument ‘1’ to ‘void legacy(Callback)’
legacy([&]() { return number; });
Jak mogę rozwiązać ten problem? Czy technicznie niemożliwe jest użycie przechwytywania lambda jako wskaźnika funkcji C?
Nie, tylko mniej-capture [lambda] (http://en.cppreference.com/w/cpp/language/lambda) może może być użyty jako wskaźnik funkcji. –
Ogólnie każde API C, które przyjmuje wskaźnik funkcji, powinno również przyjmować pewien rodzaj "kontekstu użytkownika", który będzie przekazywany do funkcji. Czy Twój interfejs API ma jedno z tych? – newacct