我想捕获一个lambda的'reference',我认为函数指针可以解决问题,如:
int (*factorial)(int) = [&](int x){
return (x < 2)
? 1
: x * factorial(x - 1);
};
但我得到cannot convert from main::lambda<......> to int(_cdecl *)(int)
。
那么指向lambda的正确方法是什么?
答案 0 :(得分:6)
由于lambda不是无状态的,因此无法将其转换为函数指针。请改用std::function
。
std::function<int(int)> factorial = [&](int x){
return (x < 2)
? 1
: x * factorial(x - 1);
};
答案 1 :(得分:5)
这最接近你已经拥有的东西:
std::function<int (int)> factorial = [&](int x){
return (x < 2)
? 1
: x * factorial(x - 1);
};
通常你也可以使用auto
,但在这种情况下它不起作用,因为函数是递归的。
答案 2 :(得分:5)
你已经有了很好的答案。以下只是好奇心,但我建议你不要使用它。
正如其他人的回答所说,lambda factorial
试图捕捉自己,因此它不是无国籍的。因此,它不能转换为函数指针。
Lambdas不需要捕获全局或static
个对象,因此如果您使factorial
成为全局或static
变量,那么您不需要捕获它,这样可以正常工作(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';
}
您还可以创建这样的工厂:
#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';
}
如果你想混淆更多:-)然后消除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;
}