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

Benjamin

靜以修身,儉以養德,非澹薄無以明志,非寧靜無以致遠。
隨筆 - 398, 文章 - 0, 評論 - 196, 引用 - 0
數據加載中……

c++和closure(閉包)

一、定義: 是帶有上下文的函數。說白了,就是有狀態的函數。必須有上下文才能使用。
函數, 帶上了狀態, 就變成了閉包了. 什么叫 "帶上狀態" 呢? 意思是這個閉包有屬于自己的變量, 這些個變量的值是創建閉包的時候設置的, 并在調用閉包的時候, 可以訪問這些變量.
函數是代碼, 狀態是一組變量 ,將代碼和一組變量捆綁 (bind) , 就形成了閉包 ,內部包含 static 變量的函數, 不是閉包, 因為這個 static 變量不能捆綁. 你不能捆綁不同的 static 變量. 這個在編譯的時候已經確定了.
二、c++實現閉包的方法:
1、重載 operator() 例子
class MyFunctor { public: MyFunctor(float f) : round(f) {} int operator()(float f) { return f + round; } private: float round; }; float round = 0.5; MyFunctor f(round);

2、std::bind
int my_func(float f, float round) { return f + round; } float round = 0.5; std::function<int(float,float)> f = my_func;

3、lambda表達式,語法形式如下: [函數對象參數] (操作符重載函數參數) mutable或exception聲明 -> 返回值類型 { …函數體…}
[函數對象參數],例如[&,a,b]標識一個Lambda的開始,這部分必須存在,不能省略。函數對象參數是傳遞給編譯器自動生成的函數對象類的構造函數的。

函數對象參數有以下形式:
[ ] 空沒有使用任何函數對象參數。
[=] 函數體內可以使用Lambda所在作用范圍內所有可見的局部變量(包括Lambda所在類的this),并且是值傳遞方式(相當于編譯器自動為我們按值傳遞了所有局部變量)。
[&] 函數體內可以使用Lambda所在作用范圍內所有可見的局部變量(包括Lambda所在類的this),并且是引用傳遞方式(相當于編譯器自動為我們按引用傳遞了所有局部變量)。
[this] 函數體內可以使用Lambda所在類中的成員變量。
[a] 將a按值進行傳遞。按值進行傳遞時,函數體內不能修改傳遞進來的a的拷貝,因為默認情況下函數是const的。要修改傳遞進來的a的拷貝,可以添加mutable修飾符。
[&a] 將a按引用進行傳遞。
[a, &b] 將a按值進行傳遞,b按引用進行傳遞。
[=,&a, &b] 除a和b按引用進行傳遞外,其他參數都按值進行傳遞。
[&, a, b] 除a和b按值進行傳遞外,其他參數都按引用進行傳遞。

(操作符重載函數參數),例如(int a,int &b)標識重載的()操作符的參數,沒有參數時,這部分可以省略。參數可以通過按值(如:(a,b))和按引用(如:(&a,&b))兩種方式進行傳遞
mutable與exception聲明,例如 mutable throw(),可省略
按值傳遞函數對象參數時,加上mutable修飾符后,可以修改按值傳遞進來的拷貝(注意是能修改拷貝,而不是值本身,如果沒有添加mutable,相當于對函數參數的增加了const修飾,無法修改參數)。exception聲明用于指定函數拋出的異常,如拋出整數類型的異常,可以使用throw(int)。

示例:
->返回值類型,例如 ->int 表示返回 int類型
標識函數返回值的類型,當返回值為void,或者函數體中只有一處return的地方(此時編譯器可以自動推斷出返回值類型)時,這部分可以省略。
{函數體},例如{cout<<“abc”;},不可省略,可以為空

// 無函數對象參數,輸出:1 2   {    for_each(vctTemp.begin(), vctTemp.end(), [](int v){ cout << v << endl; });   }
   
// 以值方式傳遞作用域內所有可見的局部變量(包括this),輸出:11 12   {    int a = 10;    for_each(vctTemp.begin(), vctTemp.end(), [=](int v){ cout << v+a << endl; });   }   
 // 以引用方式傳遞作用域內所有可見的局部變量(包括this),輸出:11 13 12   {    int a = 10;    for_each(vctTemp.begin(), vctTemp.end(), [&](int v)mutable{ cout << v+a << endl; a++; });    cout << a << endl;   }   
 // 以值方式傳遞局部變量a,輸出:11 13 10   {    int a = 10;    for_each(vctTemp.begin(), vctTemp.end(), [a](int v)mutable{ cout << v+a << endl; a++; });    cout << a << endl;   }
   
// 以引用方式傳遞局部變量a,輸出:11 13 12   {    int a = 10;    for_each(vctTemp.begin(), vctTemp.end(), [&a](int v){ cout << v+a << endl; a++; });    cout << a << endl;   }   
 // 傳遞this,輸出:21 22   {    for_each(vctTemp.begin(), vctTemp.end(), [this](int v){ cout << v+m_nData << endl; });   }    
// 除b按引用傳遞外,其他均按值傳遞,輸出:11 12 17   {    int a = 10;    int b = 15;    for_each(vctTemp.begin(), vctTemp.end(), [=, &b](int v){ cout << v+a << endl; b++; });    cout << b << endl;   }

int temp = 10;
vector<int> ivec = {30, -10, -20, 50, 40 ,100, -50};
std::sort(ivec.begin(), ivec.end(), [](const int &x, const int &y) {return abs(x) < abs(y);});
std::for_each(ivec.begin(), ivec.end(), [&](int &x) { x += temp; cout << x << endl;});
三、注意事項:
比較上面三種方式,有一些細節需要注意:

1. closure的狀態特指其運行的上下文。 closure將存貯它運行時需要的上下文,從而保證在closure創建時的上下文可以在closure運行時依然有效。

比如round就是closure的上下文。保存上下文的這一特點通常被稱作“capture”或者是"bind"。 capture可以自己寫,比如MyFuctor f(round); 也可以用boost::bind。

當然最方便的還是讓編譯器幫你自動完成。編譯器將自動識別closure用到的變量,然后創建一個匿名的類,將這個變量保存到匿名類的成員變量中。

C++中有兩種capture方式,by value和by reference。寫法是[=]和[&]。

需要注意的是,capture by reference是不會修改被capture變量的生命周期的,你要保證被capture的變量在closure運行時是有效的。

這一點不像Java,Java中變量被capture的話,就變成被引用了,從而GC不會回收它。

2. closure的類型是隱藏的,每次創建一個closure,編譯器都會創建一個新的類型。

如果你想保存一個clousre時就不是那么直接,因為你不知道它的類型。這時那需要一些模板技巧,可參考boost::function的實現。

簡單的方式是直接用std::function來保存。

std::function<int(float)> closure;

closure = [](float f) { return 0.0f };

closure = [](float f) { return 1.0f };

四、閉包(匿名函數)用處,可以是流程更清晰,易于理解,一般不能單獨使用,必須有上下文,閉包里處理的是上下文中的一些變量。一般情況下不能單獨使用
auto Do=[&]()
{

}
auto nextDo=[=](){
}

posted on 2018-05-27 18:17 Benjamin 閱讀(836) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美成人69| 欧美日韩高清在线一区| 欧美视频观看一区| 日韩系列在线| 一本色道久久加勒比88综合| 欧美日韩免费高清| 午夜精品在线观看| 欧美在线免费观看亚洲| 亚洲电影在线看| 亚洲精品在线一区二区| 国产精品美女主播| 久久久噜噜噜久久中文字幕色伊伊| 久久国产精品第一页| 亚洲欧洲精品一区二区精品久久久 | 久久爱另类一区二区小说| 欧美一区2区三区4区公司二百| 国内久久婷婷综合| 欧美激情一区二区三区不卡| 欧美体内谢she精2性欧美| 久久久久免费视频| 欧美久久久久| 久久亚洲不卡| 欧美视频一区| 免费看的黄色欧美网站| 国产精品久久久久久久久果冻传媒 | 亚洲成人在线网| 欧美刺激午夜性久久久久久久| 亚洲一区二区四区| 久久婷婷国产综合精品青草| 亚洲视频久久| 另类激情亚洲| 欧美自拍偷拍| 欧美日韩精品一区二区| 美女视频黄a大片欧美| 国产精品激情偷乱一区二区∴| 毛片基地黄久久久久久天堂| 国产精品久久久久毛片软件| 亚洲国产精品一区二区第一页 | 国产亚洲福利一区| av不卡免费看| 亚洲精品久久久久久一区二区| 亚洲一区二区三区在线播放| 9人人澡人人爽人人精品| 久久国产精品久久w女人spa| 亚洲在线免费视频| 欧美日韩不卡在线| 亚洲国产清纯| 亚洲黄色免费电影| 亚洲欧美日韩精品一区二区 | 夜夜嗨av一区二区三区| 久久婷婷影院| 麻豆成人在线| 国产综合第一页| 欧美怡红院视频一区二区三区| 亚洲一区二区三区四区五区黄| 欧美—级a级欧美特级ar全黄| 欧美国产精品一区| 亚洲国产日韩一区| 你懂的视频一区二区| 欧美va亚洲va香蕉在线| 一区免费视频| 久久久久久有精品国产| 鲁大师影院一区二区三区| 国产欧美一区二区三区视频| 亚洲欧美日韩成人高清在线一区| 亚洲欧美不卡| 国产精品区一区| 亚洲一区二区三区中文字幕在线 | 亚洲精品欧洲精品| 欧美成人网在线| 亚洲精品乱码视频| 一区二区三区不卡视频在线观看 | 9l国产精品久久久久麻豆| 欧美日韩国产一区精品一区| 亚洲黄页一区| 亚洲在线视频网站| 国产亚洲精品aa| 久久一区二区三区超碰国产精品| 欧美高清在线观看| 中日韩美女免费视频网址在线观看| 欧美日韩天天操| 亚欧成人精品| 欧美jjzz| 亚洲综合色网站| 国产一区二区三区四区hd| 久久久久久一区| 日韩一二三在线视频播| 欧美一区二区国产| 在线观看中文字幕不卡| 欧美精品一区在线| 午夜精品一区二区在线观看| 免费观看亚洲视频大全| 中文亚洲字幕| 韩国三级在线一区| 欧美片第一页| 欧美伊人久久大香线蕉综合69| 欧美成人乱码一区二区三区| 制服诱惑一区二区| 激情欧美日韩| 国产精品久久久久77777| 欧美中文字幕第一页| 亚洲精品国产精品国自产在线| 欧美一级在线亚洲天堂| 亚洲区中文字幕| 国产精品亚洲一区| 欧美国产精品va在线观看| 午夜精品国产| 99精品国产热久久91蜜凸| 久久久久免费视频| 亚洲一区二区在线免费观看| 亚洲高清在线精品| 国产视频观看一区| 欧美三级网址| 亚洲欧美成人网| 玖玖国产精品视频| 欧美三级特黄| 久久久亚洲精品一区二区三区| 久久人91精品久久久久久不卡| 国产视频精品免费播放| 最近中文字幕日韩精品| 亚洲一区国产一区| 亚洲视频视频在线| 欧美大尺度在线| 亚洲卡通欧美制服中文| 久久精品一二三| 久久精品亚洲精品| 狠狠色香婷婷久久亚洲精品| 亚洲欧美一区二区三区久久| 亚洲人人精品| 久久久久**毛片大全| 亚洲高清资源| 国产精品99久久久久久久久| 欧美成人一区二区在线| 亚洲天堂免费观看| 亚洲一区二区高清视频| 黄色精品在线看| 亚洲精品国产日韩| 欧美日本一区| 亚洲区欧美区| 国产亚洲综合性久久久影院| 一本一本a久久| 亚洲少妇一区| 久久精精品视频| 亚洲精品欧美激情| 午夜亚洲激情| 校园春色国产精品| 欧美日韩国产123| 久久中文字幕导航| 久久综合九色欧美综合狠狠| 午夜精品福利在线| 欧美视频一区在线观看| 亚洲天堂成人| 欧美刺激午夜性久久久久久久| 欧美一区二区三区在线视频| 一区二区三区日韩| 亚洲视频一区二区| 亚洲在线观看视频网站| 国产精品午夜电影| 欧美影院久久久| 久久久精品999| 欧美一区二区三区免费观看视频 | 欧美日韩国产黄| 亚洲国产精品成人一区二区 | 欧美高清日韩| 亚洲精品国产精品国自产观看浪潮| 在线国产亚洲欧美| 男人插女人欧美| 欧美黄网免费在线观看| 在线免费日韩片| 国产精品成人观看视频免费 | 性高湖久久久久久久久| 欧美不卡高清| 日韩亚洲精品在线| 欧美一区在线看| 亚洲欧洲精品成人久久奇米网| 欧美成人精精品一区二区频| 亚洲欧美日韩国产中文| 免费在线成人av| 在线亚洲欧美视频| 国产欧美在线看| 国产又爽又黄的激情精品视频 | 欧美视频三区在线播放| 欧美国产第一页| 亚洲欧美日韩国产成人精品影院 | 国产亚洲一区在线| 午夜视频一区二区| 夜夜嗨av色一区二区不卡| 免费亚洲网站| 亚洲福利视频网站| 久久综合色播五月| 亚洲摸下面视频| 国模精品一区二区三区色天香| 久久av红桃一区二区小说| 亚洲免费在线观看视频| 日韩视频免费大全中文字幕| 久久这里有精品15一区二区三区| 欧美在线一区二区| 99re热这里只有精品免费视频| 亚洲一级黄色片| 9国产精品视频|