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

Conversion of lambda expression to function pointer

本文关键字:函数 指针 转换 lambda 表达式      更新时间:2023-10-16

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

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,该使用什么语法?

还有,括号里有东西的lambda呢?例如:

int y = 5;
auto lambda2 = [y](void)->int{return y;};

如果这种lambda不能转换为函数指针,是否有一种替代方法将这种类型的lambda表达式传递给printOut(甚至是printOut的修改版本,如果是这样,语法是什么)?

本身没有语法,这是一个隐式转换。只需对其进行强制转换(显式或隐式),就可以获得函数指针。但是,这个问题在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) 
{
    // ...
}

各有利弊


†据我所知,目前还不知道我们是否会在服务包中获得它,或者我们是否需要等到新的版本。