国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++實(shí)現(xiàn)的一個(gè)可以寫遞歸lambda的Y函數(shù)

2020-05-23 14:24:07
字體:
供稿:網(wǎng)友
這篇文章主要介紹了C++實(shí)現(xiàn)的一個(gè)可以寫遞歸lambda的Y函數(shù),在Y函數(shù)的幫助,這個(gè)lambda表達(dá)是可以成功看到自己,然后遞歸調(diào)用的,需要的朋友可以參考下
 
 

最近學(xué)習(xí)C++11的variadic template argument,終于可以擺脫用fpmacro模板來復(fù)制一大堆代碼的做法了,好開心。這個(gè)例子的main函數(shù)用lambda寫了一個(gè)斐波那契數(shù)列的遞歸計(jì)算函數(shù)。跟以往不同的是,在Y函數(shù)的幫助下,這個(gè)lambda表達(dá)是可以成功看到自己,然后遞歸調(diào)用。當(dāng)然這仍然需要用普通的C++遞歸來實(shí)現(xiàn),并不是λ-calculus那個(gè)高大上的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;}

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 徐汇区| 铅山县| 河源市| 白银市| 广州市| 望城县| 文登市| 芦山县| 松潘县| 麟游县| 页游| 锡林郭勒盟| 长阳| 辽阳县| 巴东县| 博罗县| 阳西县| 桐梓县| 南投县| 石景山区| 新河县| 汝城县| 扎鲁特旗| 蛟河市| 肥城市| 张家港市| 朝阳市| 呼图壁县| 通山县| 昌图县| 璧山县| 黄陵县| 徐闻县| 苏尼特右旗| 九龙城区| 萨迦县| 浑源县| 岑巩县| 尉氏县| 年辖:市辖区| 文山县|