Bạn đã có câu trả lời hay. Sau đây chỉ là một sự tò mò nhưng tôi sẽ không đề nghị bạn sử dụng nó.
Khi người khác trả lời, lambda factorial
cố gắng chụp chính nó và do đó nó không phải là không trạng thái. Do đó, nó không thể chuyển đổi thành con trỏ hàm.
Lambdas không cần phải nắm bắt đối tượng toàn cầu hoặc static
, vì vậy nếu bạn thực hiện factorial
một biến toàn cầu hoặc static
sau đó bạn không cần phải nắm bắt nó và làm việc này tốt (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';
}
bạn cũng có thể tạo một nhà máy như thế này:
#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';
}
Nếu bạn muốn xáo trộn nhiều hơn :-) sau đó loại bỏ 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;
}
Nguồn
2013-06-28 14:32:11
Một lambda có thể được chuyển đổi thành một con trỏ hàm nếu nó không nắm bắt bất cứ điều gì. – jrok
Tuyệt, bạn nói đúng. Tốt để biết, cảm ơn. – sircodesalot
Đây gần như là một bản sao của http://stackoverflow.com/questions/2067988/recursive-lambda-functions-in-c0x – doctorlove