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

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>
            亚洲欧美日韩综合| 免费成人美女女| 国产视频一区在线观看一区免费| 欧美激情一区在线| 欧美日韩高清在线观看| 欧美网站在线观看| 国产一区二区三区四区在线观看 | 久久精品国产亚洲一区二区| 亚洲欧美电影院| 欧美在线观看网站| 欧美mv日韩mv国产网站| 欧美性猛交视频| 国内欧美视频一区二区| 亚洲三级性片| 欧美一区二区久久久| 免费在线观看精品| 一区二区三区四区五区精品视频| 亚洲四色影视在线观看| 欧美自拍偷拍午夜视频| 欧美国产大片| 国产日本亚洲高清| 亚洲精品一区二区三区福利| 亚洲综合社区| 亚洲第一中文字幕在线观看| 亚洲第一在线视频| 亚洲综合丁香| 欧美日韩国产精品专区| 国内在线观看一区二区三区| 一二三区精品| 免费中文字幕日韩欧美| 在线亚洲成人| 欧美久久久久免费| 136国产福利精品导航| 亚洲欧美日韩在线一区| 欧美激情2020午夜免费观看| 亚洲一区二区在线免费观看| 欧美大片一区二区三区| 国产综合av| 欧美亚洲在线| a4yy欧美一区二区三区| 欧美99久久| 亚洲国产成人久久综合| 久久不射网站| 亚洲区欧美区| 久久综合福利| 国产九色精品成人porny| 亚洲精品在线免费| 久久久久久一区| 亚洲免费影视| 国产精品美女久久久久久免费| 日韩亚洲国产欧美| 亚洲电影自拍| 欧美激情综合五月色丁香小说| 影音先锋在线一区| 久久久综合免费视频| 亚洲欧美大片| 国产一区二区三区免费观看| 久久成人这里只有精品| 亚洲一区二区三区精品视频| 欧美日在线观看| 亚洲视频观看| 亚洲一区二三| 好吊日精品视频| 男男成人高潮片免费网站| 久久女同精品一区二区| 亚洲国产精品久久久久秋霞蜜臀| 免费看的黄色欧美网站| 免播放器亚洲一区| 一区二区三区视频在线看| 夜夜精品视频| 国产亚洲精品7777| 欧美电影在线播放| 欧美日韩国产二区| 欧美一级久久久| 久久久无码精品亚洲日韩按摩| 亚洲国产精品久久久久婷婷884| 免费在线看一区| 免费观看成人| 亚洲一区精品视频| 欧美中文字幕在线播放| 亚洲国产精品99久久久久久久久| 亚洲第一精品电影| 国产精品jizz在线观看美国| 久久本道综合色狠狠五月| 久久天天躁狠狠躁夜夜爽蜜月 | 午夜电影亚洲| 久久精品国产99国产精品| 亚洲国产高清一区| 宅男噜噜噜66一区二区| 国内精品国产成人| 亚洲免费观看| 激情综合亚洲| 日韩亚洲欧美高清| 狠狠色2019综合网| 亚洲精品无人区| 国内精品**久久毛片app| 亚洲精品乱码久久久久久按摩观| 国产精品夜夜嗨| 亚洲国产美女精品久久久久∴| 国产精品白丝黑袜喷水久久久 | 宅男噜噜噜66一区二区| 午夜一级久久| 国产日韩欧美日韩| 欧美一区亚洲| 亚洲精品美女在线| 亚洲欧美综合精品久久成人| 亚洲狠狠丁香婷婷综合久久久| 亚洲深夜福利网站| 亚洲黄网站在线观看| 亚洲欧洲99久久| 国产精品99久久久久久宅男 | 国产麻豆综合| 亚洲黄色av一区| 欲香欲色天天天综合和网| 亚洲永久精品国产| 夜久久久久久| 欧美风情在线| 欧美69wwwcom| 国外成人在线视频| 午夜亚洲福利在线老司机| 亚洲欧美国产精品桃花| 欧美黄在线观看| 亚洲电影成人| 亚洲黄网站在线观看| 久久久久天天天天| 久久久中精品2020中文| 国产日韩亚洲| 午夜精品久久久久久久蜜桃app| 中文亚洲欧美| 欧美色综合网| 一区二区三区波多野结衣在线观看| 欧美中文日韩| 性久久久久久| 国产精品中文字幕欧美| 亚洲欧美三级伦理| 欧美一区二区三区另类| 国产伦精品一区二区三区高清版| 制服丝袜激情欧洲亚洲| 亚洲一本视频| 国产精品久久91| 亚洲淫性视频| 久久精品免费看| 在线不卡中文字幕| 噜噜噜噜噜久久久久久91| 欧美黄色免费| 一区二区三区欧美激情| 欧美午夜精品电影| 一区二区三区你懂的| 亚洲欧美国产精品va在线观看| 国产精品日日做人人爱| 性色av一区二区三区在线观看| 久久久久国色av免费看影院 | 欧美精选在线| 一二三区精品| 久久久国产精品一区二区三区| 好男人免费精品视频| 欧美91视频| 一区二区三区国产在线| 欧美永久精品| 亚洲韩国日本中文字幕| 欧美日韩国产一区二区三区| 亚洲色无码播放| 久久这里有精品视频| 亚洲缚视频在线观看| 欧美久久精品午夜青青大伊人| 亚洲制服av| 国产精品99久久久久久人 | 亚洲私人影吧| 国产欧美日韩视频一区二区三区| 久久成人精品| 亚洲精品护士| 久久久久久久尹人综合网亚洲 | 亚洲一级影院| 蜜臀久久久99精品久久久久久| 日韩视频精品| 国内成+人亚洲| 国产精品v片在线观看不卡 | 久久乐国产精品| 艳女tv在线观看国产一区| 国产三级欧美三级日产三级99| 美女精品国产| 亚洲欧美色一区| 夜久久久久久| 欧美激情一区二区三区在线视频| 校园激情久久| av成人国产| 亚洲激情一区| 黄色av日韩| 国产精品一区二区三区久久久| 欧美高潮视频| 久久天堂成人| 久久精品2019中文字幕| 亚洲一级电影| 日韩亚洲国产欧美| 亚洲激情小视频| 男人天堂欧美日韩| 久久九九99视频| 久久激五月天综合精品| 亚洲一区二区视频在线观看| 亚洲精品在线三区|