• <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>
            posts - 18,  comments - 104,  trackbacks - 0

            看看之前做到哪里了:實現(xiàn)了一個賦值的lambda表達式。

            這次來看看怎么添加新的運算進去,然后再說點關(guān)于表達式的問題,為以后的擴展打下理論基礎(chǔ)。

            先看看之前的代碼吧,

             1 template <typename _U>
             2 struct op
             3 {
             4     op(_U i)
             5         : _i(i)
             6     {}
             7 
             8     _U _i;
             9 
            10     template<typename _T>
            11     _T& operator()(_T& i)
            12     {
            13         i = _i;
            14     }
            15 };
            16 
            17 struct place_holder
            18 {
            19     template <typename _T>
            20     op<_T> operator=(_T i)
            21     {
            22         return op<_T>(i)
            23     }
            24 };
            25 
            26 place_holder _1;
            27 
            28 vector<double> v;
            29 for_each(v.begin(), v.end(), _1 = 3);

            現(xiàn)在,要在這個基礎(chǔ)上,添加新的操作進來,比如說operator+=吧。要怎么做呢?

            1.  place_holder要重載operator+= 才可以,因為place_holder的主要任務(wù)就是替我們生成一個仿函數(shù)。
            2.  要有相應(yīng)的仿函數(shù)來真正的做 += ,也就是說在仿函數(shù)的operator()里面,要有真正干活的操作。

            好了,開始吧, 先看看實現(xiàn),然后在解釋。

             1 struct op
             2 {
             3     op(int i)
             4         : _i(i)
             5     {}
             6 
             7     int _i;
             8 
             9     int operator()(int& i)
            10     {
            11         return i = _i;
            12     }
            13 };
            14 
            15 struct op1
            16 {
            17     op1(int i)
            18         : _i(i)
            19     {}
            20 
            21     int _i;
            22 
            23     int operator()(int& i)
            24     {
            25         return i += _i;
            26     }
            27 };
            28 
            29 struct place_holder
            30 {
            31     op operator=(int i)
            32     {
            33         return op(i);
            34     }
            35 
            36     op1 operator+=(int i)
            37     {
            38         return op1(i);
            39     }
            40 };
            41 
            42 place_holder _1;
            43 
            44 void main()
            45 {
            46 
            47     vector<int> v;
            48     v.push_back(12);
            49     v.push_back(1342);
            50     v.push_back(23);
            51 
            52     for_each(v.begin(), v.end(), _1 += 3);
            53 }

            好了,現(xiàn)在+=操作已經(jīng)被支持了。多么簡單呀。來看看都做了些什么:

            1.  給place_holder增加了一個operator+=函數(shù), operator+= 返回op1類型的仿函數(shù)。
            2.  增加了一個op1的仿函數(shù)(類模板),用來真正的執(zhí)行 += 的運算。

            當(dāng)編譯器看到  _1 += 3 時,去找到 place_holder::operator+=, 然后把模板參數(shù)推導(dǎo)成 int,返回一個 op1<int> 對象。
            在for_each里面,就調(diào)用op1<int>::operator+=了。

            當(dāng)然也可以這么用:

            1 double x = 0.0;
            2 (_1 += 10.4)(x);

            到這里大家想必已經(jīng)可以照貓畫虎,實現(xiàn)其他操作了吧。但是當(dāng)實現(xiàn)的操作多起來的時候,新的問題就來了,比如想要個 _1 = _2 + 3.0 的時候呢?看看下面的代碼:

             1 _1 = _2 + 3.0    //lambda表達式
             2 
             3 void fun(double& lhs, const double& rhs)  //相同功能函數(shù)
             4 {
             5     lhs = rhs + 3.0;
             6 }
             7 
             8 struct op
             9 {
            10     template <typename _T>
            11     _T operator(_T& lhs, const _T& rhs)
            12     {
            13         lhs = rhs + 3.0;
            14     }
            15 };
            16 

            看看lambda表達式為我們省了多少代碼!當(dāng)然我不是為了說這個而寫這么長段代碼,我想說,那個op是我們的最終目標,能實現(xiàn)嗎?不能!因為在op里面直接出現(xiàn)了3.0,按照前面的慣例,應(yīng)該在op里面有一個成員變量來保存3.0,不是嗎?根本問題不在這里。

            仔細想想我們到底在做什么,我們在用template的技法,“編譯”表達式。
            place_holder其實就像C++的表達式,op就像匯編語言,通過template技法,把place_holder的表達式“編譯”成用op組成的操作,op是可以直接被C++運行的仿函數(shù)。也就是說是一個從lambda語法到C++語法的編譯器,但是這個編譯器靠template技法實現(xiàn),由真正的C++編譯器進行模板推導(dǎo),最后“編譯”成C++的仿函數(shù)。所以一句話就是:

            用template技法實現(xiàn)的從lambda語法到C++語法的“編譯器”。

            所以根本問題在于op的這種寫法沒有辦法擴展,難道對于每種連起來的操作,都分別寫一個op嗎(比如_1 = (_2 + 3.0) * (_2 - 3.0),C++中表達式無數(shù),要是每種都要寫個op,那要lambda何用 )?op相當(dāng)于匯編,只要幾個簡單的運算就OK,關(guān)鍵在于按照place_holder的表達,把op組合起來。

            下一篇準備介紹一下boost::tuple,和表達式編譯,因為它們是實現(xiàn)lambda的關(guān)鍵武器。
            posted on 2009-02-22 22:11 尹東斐 閱讀(1788) 評論(1)  編輯 收藏 引用 所屬分類: 深入探索 boost::lambda 系列

            FeedBack:
            # re: 深入探索 boost::lambda 系列(三)
            2011-06-16 17:48 | lucida
            lambda里面想構(gòu)造一個class A的實例,A帶構(gòu)造參數(shù)的,怎么寫  回復(fù)  更多評論
              
            <2009年4月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            常用鏈接

            留言簿(4)

            隨筆檔案

            文章分類

            文章檔案

            相冊

            好友博客

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            伊人久久五月天| 国产成人香蕉久久久久| 欧美亚洲国产精品久久久久| 亚洲精品无码久久不卡| 欧美一区二区三区久久综合| 俺来也俺去啦久久综合网| 99久久精品无码一区二区毛片 | 日本强好片久久久久久AAA| 97热久久免费频精品99| 欧美日韩精品久久久久| 国产99精品久久| 久久伊人五月丁香狠狠色| 国产成人久久精品区一区二区| 少妇久久久久久被弄到高潮| 久久AV高清无码| 国产一区二区久久久| 久久亚洲高清观看| 久久久一本精品99久久精品66| 国产成人无码精品久久久久免费| 久久久久久毛片免费播放| 亚洲国产婷婷香蕉久久久久久| 狠狠色丁香婷婷久久综合不卡| 久久人人添人人爽添人人片牛牛| 久久精品国产亚洲Aⅴ蜜臀色欲| 东京热TOKYO综合久久精品| 久久亚洲精品成人无码网站| 日韩中文久久| 久久国产欧美日韩精品免费| 国产免费福利体检区久久| 久久国产乱子精品免费女| 国产精品久久久久久久久鸭| 一本色道久久综合狠狠躁| 久久精品国产亚洲AV香蕉| 国产成人综合久久精品红| 久久久久久亚洲精品影院| 精品久久久中文字幕人妻 | 一本久久久久久久| 大美女久久久久久j久久| 成人精品一区二区久久久| 国产激情久久久久影院老熟女| 99久久综合国产精品二区|