Header 嵌套 C++ lambda 函数
Header for nested C++ lambda function
考虑以下(简化的)示例,其中两个 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;
}
这 returns 通常的错误 未声明的标识符 'g' 这是预期的,因为没有 header 文件。所以我的问题是:声明这两个 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);
使用 std::function 解决问题。
#include <functional>
#include <iostream>
std::function<int(int)> f;
std::function<int(int)> g;
int main()
{
f = [](int n)
{
if(n >= 5) return n;
return g(n+1);
};
g = [](int n)
{
if(n >= 5) return n;
return f(n+1);
};
std::cout << f(1) << std::endl;
return 0;
}
lambda 的类型没有明确定义,因此没有直接的答案。我更喜欢@bashrc 的回答,但如果你坚持要有两个 lambda,这个变体可能会起作用:
extern int (*f)(int n);
auto g = [](int n)
{
if (n >= 5) return n;
return f(n + 1);
};
int (*f)(int n) = [](int n)
{
if (n >= 5) return n;
return g(n + 1);
};
int main()
{
f(1);
return 0;
}
这适用于我的机器:
#include <functional>
#include <iostream>
#include <stdio.h>
using namespace std;
extern function<int(int, function<int(int)>)> g;
auto f = [](int n, function<int(int)> h)
{
if (n >= 5) return n;
cout << "h is some function " << h(4.0) << endl;
auto func = [h](int m) { return m*h(m); };
return g(n + 1, func);
};
function<int(int, function<int(int)>)> g = [](int n, function<int(int)> h)
{
if (n >= 5) return n;
cout << "h is some function " << h(5.0) << endl;
auto func = [h](int m) { return m*h(m); };
return f(n + 1, func);
};
int main()
{
auto initial_function = [](int m) { return m*m; };
f(1, initial_function);
getchar();
return 0; // Return value of the function is int so its better to use 0 rather than 0.0
}
考虑以下(简化的)示例,其中两个 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;
}
这 returns 通常的错误 未声明的标识符 'g' 这是预期的,因为没有 header 文件。所以我的问题是:声明这两个 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);
使用 std::function 解决问题。
#include <functional>
#include <iostream>
std::function<int(int)> f;
std::function<int(int)> g;
int main()
{
f = [](int n)
{
if(n >= 5) return n;
return g(n+1);
};
g = [](int n)
{
if(n >= 5) return n;
return f(n+1);
};
std::cout << f(1) << std::endl;
return 0;
}
lambda 的类型没有明确定义,因此没有直接的答案。我更喜欢@bashrc 的回答,但如果你坚持要有两个 lambda,这个变体可能会起作用:
extern int (*f)(int n);
auto g = [](int n)
{
if (n >= 5) return n;
return f(n + 1);
};
int (*f)(int n) = [](int n)
{
if (n >= 5) return n;
return g(n + 1);
};
int main()
{
f(1);
return 0;
}
这适用于我的机器:
#include <functional>
#include <iostream>
#include <stdio.h>
using namespace std;
extern function<int(int, function<int(int)>)> g;
auto f = [](int n, function<int(int)> h)
{
if (n >= 5) return n;
cout << "h is some function " << h(4.0) << endl;
auto func = [h](int m) { return m*h(m); };
return g(n + 1, func);
};
function<int(int, function<int(int)>)> g = [](int n, function<int(int)> h)
{
if (n >= 5) return n;
cout << "h is some function " << h(5.0) << endl;
auto func = [h](int m) { return m*h(m); };
return f(n + 1, func);
};
int main()
{
auto initial_function = [](int m) { return m*m; };
f(1, initial_function);
getchar();
return 0; // Return value of the function is int so its better to use 0 rather than 0.0
}