C ++ 11中的递归lambda函数

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.cpp

sum.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);};

有人可以点亮这个吗?


Qyouu
浏览 489回答 3
3回答

慕尼黑8549860

使用C ++ 14,现在很容易制作一个有效的递归lambda,而不必std::function在几行代码中产生额外的开销(从原始代码中进行少量编辑以防止用户意外复制):template&nbsp;<class&nbsp;F>struct&nbsp;y_combinator&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;F&nbsp;f;&nbsp;//&nbsp;the&nbsp;lambda&nbsp;will&nbsp;be&nbsp;stored&nbsp;here &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;a&nbsp;forwarding&nbsp;operator(): &nbsp;&nbsp;&nbsp;&nbsp;template&nbsp;<class...&nbsp;Args> &nbsp;&nbsp;&nbsp;&nbsp;decltype(auto)&nbsp;operator()(Args&&...&nbsp;args)&nbsp;const&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;we&nbsp;pass&nbsp;ourselves&nbsp;to&nbsp;f,&nbsp;then&nbsp;the&nbsp;arguments. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;[edit:&nbsp;Barry]&nbsp;pass&nbsp;in&nbsp;std::ref(*this)&nbsp;instead&nbsp;of&nbsp;*this &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;f(std::ref(*this),&nbsp;std::forward<Args>(args)...); &nbsp;&nbsp;&nbsp;&nbsp;}};//&nbsp;helper&nbsp;function&nbsp;that&nbsp;deduces&nbsp;the&nbsp;type&nbsp;of&nbsp;the&nbsp;lambda:template&nbsp;<class&nbsp;F>y_combinator<std::decay_t<F>>&nbsp;make_y_combinator(F&&&nbsp;f)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;{std::forward<F>(f)};}您的原始sum尝试成为:auto&nbsp;sum&nbsp;=&nbsp;make_y_combinator([term,next](auto&nbsp;sum,&nbsp;int&nbsp;a,&nbsp;int&nbsp;b)&nbsp;{ &nbsp;&nbsp;if&nbsp;(a>b)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; &nbsp;&nbsp;} &nbsp;&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;term(a)&nbsp;+&nbsp;sum(next(a),b); &nbsp;&nbsp;}});
打开App,查看更多内容
随时随地看视频慕课网APP