Hai già buone risposte. Quello che segue è solo una curiosità ma non ti suggerirei di usarlo.
Come detto da altri, la lambda factorial
tenta di catturare se stessa e quindi non è apolidi. Pertanto, non è convertibile in un puntatore a funzione.
Lambda non hanno bisogno di catturare gli oggetti globali o static
, quindi se si effettua factorial
una variabile globale o static
allora non c'è bisogno di catturare e questo funziona bene (GCC 4.7.2)
#include <iostream>
typedef int (*function)(int);
int main() {
static function factorial = [](int x){
return (x < 2) ? 1 : x * factorial(x - 1);
};
std::cout << factorial(5) << '\n';
}
È inoltre possibile creare una fabbrica come questa:
#include <iostream>
typedef int (*function)(int);
function make_factorial() {
static function factorial = [](int x){
return (x < 2) ? 1 : x * factorial(x - 1);
};
return factorial;
}
int main() {
auto factorial = make_factorial();
std::cout << factorial(5) << '\n';
}
Se si vuole offuscare ancora di più :-) quindi eliminare il typedef
:
// This is a function returning a pointer to a function taking an int and returning an int.
int (*(make_factorial)())(int) {
static int (*factorial)(int) = [](int x){
return (x < 2) ? 1 : x * factorial(x - 1);
};
return factorial;
}
fonte
2013-06-28 14:32:11
Un lambda può essere convertito in un puntatore a funzione se non cattura nulla. – jrok
Cool, hai ragione. Buono a sapersi, grazie. – sircodesalot
Questo è quasi un duplicato di http://stackoverflow.com/questions/2067988/recursive-lambda-functions-in-c0x – doctorlove