C++实现的一个可以写递归lambda的Y函数

 更新时间:2014年07月22日 09:24:44   投稿:junjie  
这篇文章主要介绍了C++实现的一个可以写递归lambda的Y函数,在Y函数的帮助,这个lambda表达是可以成功看到自己,然后递归调用的,需要的朋友可以参考下

最近学习C++11的variadic template argument,终于可以摆脱用fpmacro模板来复制一大堆代码的做法了,好开心。这个例子的main函数用lambda写了一个斐波那契数列的递归计算函数。跟以往不同的是,在Y函数的帮助下,这个lambda表达是可以成功看到自己,然后递归调用。当然这仍然需要用普通的C++递归来实现,并不是λ-calculus那个高大上的Y Combinator。

#include <functional>
#include <memory>
#include <iostream>
#include <string>

using namespace std;

template<typename TResult, typename ...TArgs>
class YBuilder
{

private:

  function<TResult(function<TResult(TArgs...)>, TArgs...)> partialLambda;

public:

  YBuilder(function<TResult(function<TResult(TArgs...)>, TArgs...)> _partialLambda)

    :partialLambda(_partialLambda)

  {

  }

  TResult operator()(TArgs ...args)const

  {

    return partialLambda(

      [this](TArgs ...args)

      {

        return this->operator()(args...);

      }, args...);

  }

};

template<typename TMethod>

struct PartialLambdaTypeRetriver

{

  typedef void FunctionType;

  typedef void LambdaType;

  typedef void YBuilderType;

};

template<typename TClass, typename TResult, typename ...TArgs>

struct PartialLambdaTypeRetriver<TResult(__thiscall TClass::*)(function<TResult(TArgs...)>, TArgs...)>
{

  typedef TResult FunctionType(TArgs...);

  typedef TResult LambdaType(function<TResult(TArgs...)>, TArgs...);

  typedef YBuilder<TResult, TArgs...> YBuilderType;

};


template<typename TClass, typename TResult, typename ...TArgs>

struct PartialLambdaTypeRetriver<TResult(__thiscall TClass::*)(function<TResult(TArgs...)>, TArgs...)const>

{

  typedef TResult FunctionType(TArgs...);

  typedef TResult LambdaType(function<TResult(TArgs...)>, TArgs...);

  typedef YBuilder<TResult, TArgs...> YBuilderType;

};

 

template<typename TLambda>

function<typename PartialLambdaTypeRetriver<decltype(&TLambda::operator())>::FunctionType> Y(TLambda partialLambda)

{

  return typename PartialLambdaTypeRetriver<decltype(&TLambda::operator())>::YBuilderType(partialLambda);

}

 

int _tmain(int argc, _TCHAR* argv[])

{

  auto fib = Y([](function<int(int)> self, int index)

  {

    return index<2

      ?1

      :self(index-1)+self(index-2);

  });

 

  for (int i = 0; i < 10; i++)
  {

    cout << fib(i) << " ";

  }

  cout << endl;

}

相关文章

  • C语言如何实现可变参数详解

    C语言如何实现可变参数详解

    这种可变参数可以说是C语言一个比较难理解的部分,下面这篇文章主要给大家介绍了关于C语言如何实现可变参数的相关资料,需要的朋友可以参考下
    2021-07-07
  • C++深入刨析类与对象的使用

    C++深入刨析类与对象的使用

    类和对象是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型;变量就是可以变化的量,存储在内存中—个可以拥有在某个范围内的可变存储区域
    2022-05-05
  • C++ Cartographer源码中关于Sensor的数据走向深扒

    C++ Cartographer源码中关于Sensor的数据走向深扒

    这篇文章主要介绍了C++ Cartographer源码中关于Sensor的数据走向,整个Cartographer源码阅读是很枯燥的, 但绝对是可以学到东西的,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • 深入聊聊C语言中的Const关键字

    深入聊聊C语言中的Const关键字

    关键字const用来定义只读变量,被const定义的变量它的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以,下面这篇文章主要给大家介绍了关于C语言中Const关键字的相关资料,需要的朋友可以参考下
    2022-02-02
  • 一起来学习C++的动态内存管理

    一起来学习C++的动态内存管理

    这篇文章主要为大家详细介绍了C++的动态内存管理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C语言数据结构之单向链表详解分析

    C语言数据结构之单向链表详解分析

    链表可以说是一种最为基础的数据结构了,而单向链表更是基础中的基础。链表是由一组元素以特定的顺序组合或链接在一起的,不同元素之间在逻辑上相邻,但是在物理上并不一定相邻。在维护一组数据集合时,就可以使用链表,这一点和数组很相似
    2021-11-11
  • 简单聊聊C++中线程的原理与实现

    简单聊聊C++中线程的原理与实现

    C++11 引入了多线程支持,提供了一套基本的线程库,包括线程、互斥量(mutex)、条件变量(condition_variable)等。这些组件可以帮助你在 C++ 程序中实现并发和多线程编程,本文就来和大家简单聊聊吧
    2023-03-03
  • C++如何获取本机的IP地址

    C++如何获取本机的IP地址

    这篇文章主要为大家详细介绍了C++如何获取本机IP地址小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 详解C语言常用的一些转换工具函数

    详解C语言常用的一些转换工具函数

    这篇文章主要介绍了C语言常用的一些转换工具函数,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • C语言实现井字棋游戏(人机对弈)

    C语言实现井字棋游戏(人机对弈)

    这篇文章主要为大家详细介绍了C语言实现井字棋人机对弈游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01

最新评论