为了账号安全,请及时绑定邮箱和手机立即绑定

C ++ 11中的递归lambda函数

C ++ 11中的递归lambda函数

C++
Qyouu 2019-08-26 15:13:22
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);
  }});


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 488 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信