Masz już dobre odpowiedzi. Poniższa jest tylko ciekawostką, ale nie sugerowałbym, żebyś z niej korzystał.
Jak powiedziała inna odpowiedź, lambda factorial
próbuje się uchwycić i dlatego nie jest bezpaństwowcem. Dlatego nie można go przekonwertować na wskaźnik funkcji.
lambdas nie trzeba uchwycić globalne lub static
przedmiotów, więc jeśli zrobisz factorial
zmienną globalną lub static
wtedy nie trzeba go uchwycić i to działa prawidłowo (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';
}
można również utworzyć fabrykę takiego:
#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';
}
Jeśli chcesz zaciemniać nawet więcej :-) następnie wyeliminować 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;
}
Lambda może zostać przekonwertowana na wskaźnik funkcji, jeśli niczego nie przechwytuje. – jrok
Fajnie, masz rację. Dobrze wiedzieć, dzięki. – sircodesalot
To jest prawie duplikat http://stackoverflow.com/questions/2067988/recursive-lambda-functions-in-c0x – doctorlove