【问题标题】:How to pass a Lambda Function as a parameter [duplicate]如何将 Lambda 函数作为参数传递 [重复]
【发布时间】:2020-08-03 08:57:52
【问题描述】:

我最近在使用 c++ 时遇到了一些问题,基本上是这样的:

在函数内部(比如说 int main),我声明了一个变量 Y = 5,我有这个 lambda 函数,它接收一个值并将 Y 相加;

我的问题是:我需要将这个 lambda 函数传递给一个已经存在的函数,以便可以在另一个函数中调用它。

我尝试了几件事,但都没有按我的预期工作(有些甚至没有工作):

double receives( double (*f)(double) )
{
    return f(5);
}

int main() 
{

    int y = 5;

    auto fun = [](double x) {
      return x + y;
    };

    cout << receives(&fun);

    return 0;
}

另一个问题是我无法更改我的接收函数签名,因为代码的其余部分,参数必须是双精度 (*f)(双精度)。我还需要 lambda 函数来继承 y 值,而不使用其他参数。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 这无法完成。 lambda 必须捕获y,但不允许衰减为指针。您可以执行此类操作的唯一方法是为y 使用全局变量或static,或更改receives 的签名。
  • 如果您可以将签名更改为double receives( std::function&lt;double(double)&gt; f ),它仍将接受与当前相同数量和类型的参数,但也会接受您想要传入的“有状态”lambda。
  • 我很害怕,无论如何,谢谢,这真的帮助了我:) 如果我更改签名,我如何将 lambda 传递给函数?我还需要改变什么吗?
  • 您的 lambda 看起来没有捕获,但使用了 y,所以我认为这是一个错字并且 lambda 正在捕获。否则将其转换为函数指针将不是问题。如果没有,请更正拼写错误并将确切的错误编辑到问题中。
  • 我没有看到任何说这个函数不能是模板的东西。与每次需要捕获 lambda 时使用 std::function 相比,这在 codegen 上的重量级要小得多。

标签: c++ function lambda parameters parameter-passing


【解决方案1】:

例如使用 std::function

#include <iostream>
#include <functional>

double receives( const std::function<double( double )> &f )
{
    return f( 5 );
}

int main() 
{
    int y = 5;

    auto fun = [y](double x) 
    {
      return x + y;
    };

    std::cout << receives( fun ) << '\n';

    return 0;
}

【讨论】:

  • 天哪,谢谢,效果很好! :D
猜你喜欢
  • 2021-04-14
  • 2018-10-26
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 2022-01-16
  • 2019-07-23
相关资源
最近更新 更多