这是对此问题的跟进问题:Lambda how can I pass as a parameter
MSDN据称已将该项目标记为已修复。我查看了规范,但是我将它们的规范转换为语法应该是什么。
例如:
void printOut(int(*eval)(int))
{
for(int x = 0; x < 4; ++x)
{
std::cout << eval(x) << std::endl;
}
}
现在说我有lambda:
auto lambda1 = [](int x)->int{return x;};
将lambda1
转换为等效的函数指针的语法是什么,以便将其传递给printOut
?
另外,lambdas实际上在括号中有什么东西呢?例如:
int y = 5;
auto lambda2 = [y](void)->int{return y;};
如果这种lambda无法转换为函数指针,是否有另一种方法可以将这种类型的lambda表达式传递给printOut
(甚至是printOut
的修改版本,如果那么语法是什么?)
答案 0 :(得分:17)
本身没有语法,它是隐式转换。简单地(明确地或隐含地)投射它,你将获得你的函数指针。但是,在Visual Studio 2010发布后,这已得到修复,因此不存在。†
正如你所指出的那样,你不能将捕获全lambda变成一个函数指针,所以它必须改变函数printOut
。您可以概括函数本身:
// anything callable
template <typename Func>
void printOut(Func eval)
{
// ...
}
或者特别概括函数类型:
// any function-like thing that fits the int(int) requirement
void printOut(std::function<int(int)> eval)
{
// ...
}
每个人都有自己的权衡。
†据我所知,不知道我们是否会在服务包中获取它,或者我们是否需要等到新版本。