考虑以下(简化的)示例,其中两个 lambda 函数相互调用,其中一个函数还采用另一个函数作为参数。我需要使用 lambda 函数,因为这些函数还会在彼此之间传递修改后的嵌套函数。
#include <iostream>
using namespace std;
auto f = [](int n, auto h)
{
if(n >= 5) return n;
cout << "h is some function " << h(4.0) << end;
auto func = [](int m){ return m*h(m); }; // some nested function
return g(n+1,func);
};
auto g = [](int n, auto h)
{
if(n >= 5) return n;
cout << "h is some function " << h(5.0) << end;
auto func = [](int m){ return m*h(m); }; // some nested function
return f(n+1,func);
};
int main()
{
auto initial_function = [](int m){ return m*m; };
f(1, initial_function);
return 0.0;
}
这会返回常见的错误未声明的标识符'g',这是预期的,因为没有头文件。所以我的问题是:声明两个 lambda 函数的正确语法是什么?
最佳答案
您需要捕获 g
内的 lambda(反之亦然)。 g
和 f
是指向(未命名)函数的变量。制作这些 lambda 没有意义。当您需要本地范围内的函数时,Lambda 效果最佳。您必须将至少其中一个转换为函数,并对其进行前向声明才能使此代码正常工作
int f(int n);
auto g = [](int n)
{
if(n >= 5) return n;
return f(n+1);
};
int f(int n)
{
if(n >= 5) return n;
return g(n+1);
}
int main()
{
f(1);
return 0.0;
}
根据OP的编辑,OP可能需要的是
template<typename T1, typename T2>
auto g(int n, const T1& f, const T2& h)
{
if(n >= 5) return n;
cout << "h is some function " << h(5.0) << end;
return f(n+1);
}
被称为:
auto h = [](int m) { return m*m; };
auto f = [h](int m) { return n >= 5 ? n : return g(n+1, f, h); };
g(n, f, h);
关于c++ - 嵌套 C++ lambda 函数的 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40734246/