青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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í)行 += 的運算。

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

當然也可以這么用:

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

到這里大家想必已經(jīng)可以照貓畫虎,實現(xiàn)其他操作了吧。但是當實現(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表達式為我們省了多少代碼!當然我不是為了說這個而寫這么長段代碼,我想說,那個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相當于匯編,只要幾個簡單的運算就OK,關(guān)鍵在于按照place_holder的表達,把op組合起來。

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

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

常用鏈接

留言簿(4)

隨筆檔案

文章分類

文章檔案

相冊

好友博客

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品久久久久久久久久久久| 亚洲欧美日韩在线高清直播| 久久精品国产亚洲aⅴ| 国产精品www网站| 亚洲一卡二卡三卡四卡五卡| 亚洲精品在线电影| 欧美伦理91| 一本久道综合久久精品| 一本色道久久综合| 欧美私人网站| 欧美一级一区| 欧美一区网站| 亚洲国产精品久久| 亚洲美女视频在线观看| 欧美三级电影大全| 欧美在线观看一区二区三区| 欧美一区视频在线| 亚洲国产精品va| 亚洲精品影视在线观看| 国产精品欧美在线| 久久亚洲欧美| 欧美成人免费va影院高清| 在线中文字幕不卡| 一本高清dvd不卡在线观看| 亚洲一级黄色av| 欧美诱惑福利视频| 亚洲高清成人| aa亚洲婷婷| 国产日本欧美一区二区| 欧美成人a∨高清免费观看| 欧美连裤袜在线视频| 亚洲一区视频在线观看视频| 性感少妇一区| 9l视频自拍蝌蚪9l视频成人 | 国产夜色精品一区二区av| 久久久久久久久蜜桃| 欧美精品在线视频观看| 久久激情五月激情| 欧美精选一区| 久热精品视频在线观看一区| 欧美日一区二区三区在线观看国产免| 久久国产精品高清| 欧美日本在线播放| 玖玖玖国产精品| 欧美性大战久久久久久久蜜臀| 看片网站欧美日韩| 国产精品久久久久久模特| 亚洲二区在线| 国产欧美精品在线播放| 亚洲毛片在线观看.| 1000部精品久久久久久久久| 亚洲色图自拍| 日韩一级黄色片| 美女视频一区免费观看| 久久精品中文字幕一区二区三区| 欧美日本精品一区二区三区| 免费成人av资源网| 国产精品麻豆欧美日韩ww| 亚洲人成网站在线观看播放| 国产区精品在线观看| 亚洲全部视频| 亚洲欧洲三级| 老巨人导航500精品| 久久国产精品高清| 国产精品人人爽人人做我的可爱 | 欧美日一区二区三区在线观看国产免 | 亚洲国产精品精华液网站| 红桃视频亚洲| 久久国产欧美精品| 欧美一区二区三区精品电影| 国产精品二区二区三区| 99re这里只有精品6| 日韩一级免费| 欧美激情导航| 亚洲精品网站在线播放gif| 亚洲精品国产精品国自产在线 | 亚洲影院在线观看| 欧美日产国产成人免费图片| 亚洲国产裸拍裸体视频在线观看乱了| 狠狠综合久久av一区二区小说 | 欧美国产在线视频| 亚洲国内自拍| 黄色成人免费网站| 99精品热视频| 欧美天天在线| 欧美伊久线香蕉线新在线| 久久久久久久久久久一区| 一区二区在线视频观看| 久久久亚洲综合| 久久综合九色九九| 亚洲国产日日夜夜| 欧美久久视频| 亚洲视频在线一区| 久久精品国产99精品国产亚洲性色 | 亚洲一区二区免费| 欧美三级午夜理伦三级中视频| 亚洲日本一区二区| 欧美一区二视频| 狠狠色伊人亚洲综合网站色| 欧美sm重口味系列视频在线观看| 亚洲激情视频在线| 亚洲欧美日韩精品久久| 国产在线国偷精品产拍免费yy| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲人成在线播放网站岛国| 午夜精品婷婷| 亚洲第一色在线| 欧美日韩一区二区在线观看| 欧美一区二区免费| 91久久久久久久久久久久久| 欧美在线亚洲综合一区| 在线免费观看视频一区| 欧美日韩综合不卡| 久久九九免费视频| 亚洲视频视频在线| 女主播福利一区| 亚洲尤物在线视频观看| 一区二区在线观看视频| 国产精品乱码妇女bbbb| 久久综合电影| 亚洲欧美国产高清| 欧美激情五月| 久久久久9999亚洲精品| 一本色道久久综合狠狠躁篇怎么玩| 狠狠色丁香婷婷综合影院| 欧美色精品天天在线观看视频| 久久久久久电影| 亚洲视频一二三| 亚洲精品美女在线观看| 毛片基地黄久久久久久天堂| 午夜精品久久久久久久久久久久| 亚洲日本精品国产第一区| 国产视频一区三区| 国产精品久久久久久久app| 欧美成人黑人xx视频免费观看| 欧美一级久久| 亚洲欧美999| 中文在线资源观看网站视频免费不卡 | 久久另类ts人妖一区二区| 99re这里只有精品6| 91久久国产综合久久91精品网站| 久久久久久亚洲综合影院红桃 | 久久亚洲捆绑美女| 亚洲调教视频在线观看| 亚洲毛片一区| 国产精品捆绑调教| 欧美一区二区三区久久精品| 亚洲尤物在线| 亚洲小少妇裸体bbw| 一区二区欧美精品| 日韩一区二区精品| 日韩亚洲一区在线播放| 日韩午夜中文字幕| 日韩视频在线一区二区三区| 亚洲精品日本| 一本色道久久综合亚洲精品按摩| 亚洲免费成人| 亚洲视频成人| 亚洲欧美日韩国产一区二区三区| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 亚洲小说欧美另类婷婷| 亚洲精品久久久久久久久久久久久 | 一本久久综合亚洲鲁鲁| 亚洲精品乱码久久久久久| 亚洲精品美女91| 一本色道久久综合亚洲精品按摩 | 欧美一区二区大片| 欧美一区免费视频| 久久米奇亚洲| 欧美激情一二三区| 国产精品高精视频免费| 国产婷婷97碰碰久久人人蜜臀| 国产综合在线视频| 亚洲激情第一区| 一区二区三区视频在线| 午夜精品网站| 欧美成人综合| 亚洲日本中文字幕免费在线不卡| 夜夜嗨av一区二区三区四季av| 亚洲网站视频| 久久久免费观看视频| 免费在线日韩av| 国产精品久久久久久久久搜平片 | 久久精品二区三区| 久久久久久噜噜噜久久久精品| 欧美激情精品久久久久久大尺度| 日韩视频中午一区| 亚洲欧洲av一区二区| 免费观看一区| 国产精品系列在线播放| 亚洲第一福利视频| 亚洲一区亚洲| 亚洲大片在线观看| 亚洲欧美日韩一区在线| 欧美国产综合| 激情一区二区| 亚洲一区亚洲| 亚洲精品1区2区| 久久久精品一区| 国产精品视频yy9099|