• <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  評(píng)論-2670  文章-0  trackbacks-0

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

            }

            posted on 2014-02-28 08:34 陳梓瀚(vczh) 閱讀(11102) 評(píng)論(3)  編輯 收藏 引用 所屬分類(lèi): C++實(shí)用技巧

            評(píng)論:
            # re: 隨手?jǐn)]了一個(gè)可以寫(xiě)遞歸lambda的Y函數(shù) 2014-02-28 09:04 | Kimmy Leo
            ...TArgs 和 TArgs... 看起來(lái)好丑。  回復(fù)  更多評(píng)論
              
            # re: 隨手?jǐn)]了一個(gè)可以寫(xiě)遞歸lambda的Y函數(shù) 2014-04-27 02:31 | Scan
            第33行可以直接用
            "return partialLambda( *this, args...);"
            哇  回復(fù)  更多評(píng)論
              
            # re: 隨手?jǐn)]了一個(gè)可以寫(xiě)遞歸lambda的Y函數(shù) 2014-05-12 07:41 | 陳梓瀚(vczh)
            @Scan
            對(duì)耶……
              回復(fù)  更多評(píng)論
              
            国产精品久久影院| 久久亚洲日韩看片无码| 国产精品久久久久久影院| 精品久久久久久久| 久久精品国产影库免费看| 久久免费观看视频| 麻豆AV一区二区三区久久| 99久久精品费精品国产| 伊人精品久久久久7777| 久久99精品久久只有精品| 亚洲欧洲久久av| 久久Av无码精品人妻系列| 99久久夜色精品国产网站| 久久精品中文无码资源站| 久久国产午夜精品一区二区三区| 99久久精品免费看国产一区二区三区 | 日本福利片国产午夜久久| 日日狠狠久久偷偷色综合0| 久久婷婷五月综合色高清| 久久www免费人成精品香蕉| 国产精品美女久久久| 精品国产乱码久久久久久呢| 久久免费香蕉视频| 久久99精品国产| 久久99精品国产麻豆宅宅| 欧美va久久久噜噜噜久久| 无码专区久久综合久中文字幕| 一本大道久久东京热无码AV| 久久久无码精品午夜| 久久人人爽人人爽AV片| 国产99久久久国产精品~~牛| 欧美精品一区二区精品久久| 狠色狠色狠狠色综合久久| 青青草原精品99久久精品66| 亚洲精品乱码久久久久久自慰| 伊人久久精品无码av一区| 国内精品人妻无码久久久影院导航| 欧美成人免费观看久久| 伊人久久成人成综合网222| 国产精品美女久久福利网站| 久久久久亚洲av成人网人人软件|