【问题标题】:Conversion of lambda expression to function pointer将 lambda 表达式转换为函数指针
【发布时间】:2011-05-02 03:15:02
【问题描述】:

这是此问题的后续问题: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的修改版本,如果是的话,语法是什么? )?

【问题讨论】:

  • “MSDN 应该已将该项目标记为已修复。” Connect 错误表示“此问题已得到修复,将在未来的版本中提供。”并不是说该修复程序适用于当前版本的编译器。
  • 哦。我想我天真地认为 sp1 会包含这个修复:P
  • 哦;抱歉,我没有看到 Connect 错误上的日期(我想这很有趣,因为我报告了它)。那时它可能没有达到将其纳入服务包的标准。

标签: c++ visual-studio-2010 lambda c++11


【解决方案1】:

本身没有语法,它是一种隐式转换。简单地转换它(显式或隐式),你就会得到你的函数指针。但是,此问题在 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) 
{
    // ...
}

每个人都有自己的权衡。


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

【讨论】:

    猜你喜欢
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2018-10-29
    • 2018-06-15
    • 2019-09-12
    • 1970-01-01
    • 2011-02-28
    相关资源
    最近更新 更多