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

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

C++實現的一個可以寫遞歸lambda的Y函數

2020-01-26 15:27:36
字體:
來源:轉載
供稿:網友

最近學習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;}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 康乐县| 宜川县| 称多县| 繁昌县| 万载县| 宝应县| 东乌珠穆沁旗| 弥渡县| 吴堡县| 定南县| 新营市| 海林市| 阳谷县| 平邑县| 祁门县| 南平市| 汕头市| 稷山县| 大埔区| 新津县| 获嘉县| 繁昌县| 甘肃省| 平乡县| 囊谦县| 永清县| 青海省| 连云港市| 新疆| 乐安县| 重庆市| 汉沽区| 寿宁县| 吉林省| 嘉兴市| 蕉岭县| 怀柔区| 沾益县| 上饶县| 松溪县| 方城县|