• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-341  評論-2670  文章-0  trackbacks-0

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

            }

            posted on 2014-02-28 08:34 陳梓瀚(vczh) 閱讀(11116) 評論(3)  編輯 收藏 引用 所屬分類: C++實用技巧

            評論:
            # re: 隨手擼了一個可以寫遞歸lambda的Y函數 2014-02-28 09:04 | Kimmy Leo
            ...TArgs 和 TArgs... 看起來好丑。  回復  更多評論
              
            # re: 隨手擼了一個可以寫遞歸lambda的Y函數 2014-04-27 02:31 | Scan
            第33行可以直接用
            "return partialLambda( *this, args...);"
            哇  回復  更多評論
              
            # re: 隨手擼了一個可以寫遞歸lambda的Y函數 2014-05-12 07:41 | 陳梓瀚(vczh)
            @Scan
            對耶……
              回復  更多評論
              
            久久av无码专区亚洲av桃花岛| 蜜臀久久99精品久久久久久| 好属妞这里只有精品久久| 国内精品久久久久影院老司| 91麻精品国产91久久久久| 久久青草国产精品一区| 国产精品久久一区二区三区| 97久久超碰成人精品网站| 99久久精品国产高清一区二区| 久久精品蜜芽亚洲国产AV| 久久亚洲精品人成综合网| 久久精品a亚洲国产v高清不卡| 久久久国产精品亚洲一区| 久久国产精品国产自线拍免费| 国产精品久久亚洲不卡动漫| 色成年激情久久综合| 久久精品国产亚洲精品| 亚洲精品NV久久久久久久久久| 国产精品久久久久a影院| 一本久道久久综合狠狠爱| 久久久一本精品99久久精品88| 国产精品久久久久天天影视| 久久综合久久综合久久综合| 久久WWW免费人成—看片| 亚洲乱码日产精品a级毛片久久| 亚洲伊人久久成综合人影院 | 亚洲va久久久噜噜噜久久男同 | 亚洲中文字幕无码一久久区| 一本一道久久综合狠狠老| 国产一区二区三区久久精品| 99久久精品国产毛片| 亚洲国产香蕉人人爽成AV片久久| 婷婷伊人久久大香线蕉AV| 久久er国产精品免费观看2| 欧美精品一区二区久久| 亚洲va中文字幕无码久久| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 国产精品久久久久久影院 | 狠狠色丁香婷婷综合久久来来去 | 中文字幕亚洲综合久久2| 久久人人爽人人爽人人片AV麻豆|