C++實現(xiàn)的一個可以寫遞歸lambda的Y函數(shù)
更新時間:2014年07月22日 09:24:44 投稿:junjie
這篇文章主要介紹了C++實現(xiàn)的一個可以寫遞歸lambda的Y函數(shù),在Y函數(shù)的幫助,這個lambda表達是可以成功看到自己,然后遞歸調用的,需要的朋友可以參考下
最近學習C++11的variadic template argument,終于可以擺脫用fpmacro模板來復制一大堆代碼的做法了,好開心。這個例子的main函數(shù)用lambda寫了一個斐波那契數(shù)列的遞歸計算函數(shù)。跟以往不同的是,在Y函數(shù)的幫助下,這個lambda表達是可以成功看到自己,然后遞歸調用。當然這仍然需要用普通的C++遞歸來實現(xiàn),并不是λ-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++函數(shù)的嵌套調用和遞歸調用學習教程
- C++使用遞歸方法求n階勒讓德多項式完整實例
- C++非遞歸建立二叉樹實例
- C++遞歸刪除一個目錄實例
- c++遞歸解數(shù)獨方法示例
- c++遞歸實現(xiàn)n皇后問題代碼(八皇后問題)
- 全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
- C++使用一個棧實現(xiàn)另一個棧的排序算法示例
- C++ 數(shù)據(jù)結構實現(xiàn)兩個棧實現(xiàn)一個隊列
- C++中用棧來判斷括號字符串匹配問題的實現(xiàn)方法
- C/C++函數(shù)調用棧的實現(xiàn)方法
- C++使用遞歸函數(shù)和棧操作逆序一個棧的算法示例
相關文章
C++實現(xiàn)分水嶺算法(Watershed Algorithm)
這篇文章主要為大家詳細介紹了C++實現(xiàn)分水嶺算法Watershed Algorithm,具有一定的參考價值,感興趣的小伙伴們可以參考一 下2018-01-01C++實現(xiàn)數(shù)字轉換為十六進制字符串的方法
這篇文章主要介紹了C++實現(xiàn)數(shù)字轉換為十六進制字符串的方法,涉及C++操作數(shù)字與字符串轉換的相關技巧,需要的朋友可以參考下2015-06-06