C++實(shí)現(xiàn)的一個(gè)可以寫(xiě)遞歸lambda的Y函數(shù)
最近學(xué)習(xí)C++11的variadic template argument,終于可以擺脫用fpmacro模板來(lái)復(fù)制一大堆代碼的做法了,好開(kāi)心。這個(gè)例子的main函數(shù)用lambda寫(xiě)了一個(gè)斐波那契數(shù)列的遞歸計(jì)算函數(shù)。跟以往不同的是,在Y函數(shù)的幫助下,這個(gè)lambda表達(dá)是可以成功看到自己,然后遞歸調(diào)用。當(dāng)然這仍然需要用普通的C++遞歸來(lái)實(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; }
- C++函數(shù)的嵌套調(diào)用和遞歸調(diào)用學(xué)習(xí)教程
- C++使用遞歸方法求n階勒讓德多項(xiàng)式完整實(shí)例
- C++非遞歸建立二叉樹(shù)實(shí)例
- C++遞歸刪除一個(gè)目錄實(shí)例
- c++遞歸解數(shù)獨(dú)方法示例
- c++遞歸實(shí)現(xiàn)n皇后問(wèn)題代碼(八皇后問(wèn)題)
- 全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- C++使用一個(gè)棧實(shí)現(xiàn)另一個(gè)棧的排序算法示例
- C++ 數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列
- C++中用棧來(lái)判斷括號(hào)字符串匹配問(wèn)題的實(shí)現(xiàn)方法
- C/C++函數(shù)調(diào)用棧的實(shí)現(xiàn)方法
- C++使用遞歸函數(shù)和棧操作逆序一個(gè)棧的算法示例
相關(guān)文章
C++實(shí)現(xiàn)分水嶺算法(Watershed Algorithm)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)分水嶺算法Watershed Algorithm,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一 下2018-01-01C語(yǔ)言復(fù)雜鏈表的復(fù)制實(shí)例詳解
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言復(fù)雜鏈表的復(fù)制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02C++實(shí)現(xiàn)數(shù)字轉(zhuǎn)換為十六進(jìn)制字符串的方法
這篇文章主要介紹了C++實(shí)現(xiàn)數(shù)字轉(zhuǎn)換為十六進(jìn)制字符串的方法,涉及C++操作數(shù)字與字符串轉(zhuǎn)換的相關(guān)技巧,需要的朋友可以參考下2015-06-06解析c語(yǔ)言switch中break語(yǔ)句的具體作用
以下是對(duì)c語(yǔ)言switch中break語(yǔ)句的作用進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-07-07