C ++ 11中的递归lambda函数我是C ++ 11的新手。我正在编写以下递归lambda函数,但它不编译。sum.cpp#include <iostream>#include <functional>auto term = [](int a)->int {
return a*a;};auto next = [](int a)->int {
return ++a;};auto sum = [term,next,&sum](int a, int b)mutable ->int {
if(a>b)
return 0;
else
return term(a) + sum(next(a),b);};int main(){
std::cout<<sum(1,10)<<std::endl;
return 0;}编译错误:vimal @ linux-718q:〜/ Study / 09C ++ / c ++ 0x / lambda> g ++ -std = c ++ 0x sum.cppsum.cpp:在lambda函数中:sum.cpp:18:36:错误:' ((<lambda(int, int)>*)this)-><lambda(int, int)>::sum'不能用作函数gcc版本gcc版本4.5.0 20091231(实验性)(GCC)但如果我改变sum()下面的声明,它的作用是:std::function<int(int,int)> sum = [term,next,&sum](int a, int b)->int {
if(a>b)
return 0;
else
return term(a) + sum(next(a),b);};有人可以点亮这个吗?
3 回答
慕尼黑8549860
TA贡献1818条经验 获得超11个赞
使用C ++ 14,现在很容易制作一个有效的递归lambda,而不必std::function
在几行代码中产生额外的开销(从原始代码中进行少量编辑以防止用户意外复制):
template <class F>struct y_combinator { F f; // the lambda will be stored here // a forwarding operator(): template <class... Args> decltype(auto) operator()(Args&&... args) const { // we pass ourselves to f, then the arguments. // [edit: Barry] pass in std::ref(*this) instead of *this return f(std::ref(*this), std::forward<Args>(args)...); }};// helper function that deduces the type of the lambda:template <class F>y_combinator<std::decay_t<F>> make_y_combinator(F&& f) { return {std::forward<F>(f)};}
您的原始sum
尝试成为:
auto sum = make_y_combinator([term,next](auto sum, int a, int b) { if (a>b) { return 0; } else { return term(a) + sum(next(a),b); }});
- 3 回答
- 0 关注
- 488 浏览
添加回答
举报
0/150
提交
取消