【发布时间】: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<double(double)> f ),它仍将接受与当前相同数量和类型的参数,但也会接受您想要传入的“有状态”lambda。 -
我很害怕,无论如何,谢谢,这真的帮助了我:) 如果我更改签名,我如何将 lambda 传递给函数?我还需要改变什么吗?
-
您的 lambda 看起来没有捕获,但使用了
y,所以我认为这是一个错字并且 lambda 正在捕获。否则将其转换为函数指针将不是问题。如果没有,请更正拼写错误并将确切的错误编辑到问题中。 -
我没有看到任何说这个函数不能是模板的东西。与每次需要捕获 lambda 时使用
std::function相比,这在 codegen 上的重量级要小得多。
标签: c++ function lambda parameters parameter-passing