将lambda表达式转换为函数指针

hel*_*922 22 c++ lambda visual-studio-2010 c++11

这是这个问题的后续问题:Lambda如何作为参数传递

据推测,MSDN已将该项标记为已修复.我看了一下规格,但是我将它们的规格转换成语法应该是什么.

例如:

void printOut(int(*eval)(int))
{
    for(int x = 0; x < 4; ++x)
    {
        std::cout << eval(x) << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在说我有lambda:

auto lambda1 = [](int x)->int{return x;};
Run Code Online (Sandbox Code Playgroud)

转换lambda1为等效的函数指针的语法是什么,以便可以传递给它printOut

那么,实际上在括号中有什么东西的lambda呢?例如:

int y = 5;
auto lambda2 = [y](void)->int{return y;};
Run Code Online (Sandbox Code Playgroud)

如果这种lambda无法转换为函数指针,是否有另一种方法可以将这种类型的lambda表达式传递给printOut(或者甚至是修改后的版本printOut,如果是这样的话语法是什么)?

GMa*_*ckG 17

这本身没有语法,它是一种隐式转换.简单地(明确地或隐含地)投射它,你将获得你的函数指针.但是,这在Visual Studio 2010发布后已得到修复,因此不存在.


正如你所指出的那样,你无法将捕获完整的lambda变成一个函数指针,所以它是printOut必须改变的函数.您可以概括函数本身:

// anything callable
template <typename Func>
void printOut(Func eval) 
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

或者特别概括函数类型:

// any function-like thing that fits the int(int) requirement
void printOut(std::function<int(int)> eval) 
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

每个人都有自己的权衡.


†据我所知,我们不知道我们会在服务包中获取它,或者我们是否需要等到新版本.