C++ lambda表達(dá)式(函數(shù)指針和function)

1. lambda表達(dá)式

lambda表達(dá)式 是一個(gè)匿名函數(shù),也就是沒有函數(shù)名的函數(shù)酗电。也叫閉包,閉就是封閉的意思内列,包就是函數(shù)撵术。lambda表達(dá)式 其實(shí)就是一個(gè)函數(shù)對(duì)象,內(nèi)部創(chuàng)建了一個(gè)重載()操作符的類话瞧。

2. lambda的格式

捕獲變量列表-> 返回值類型(函數(shù)主體) 嫩与,lambda可以隱士返回,也就是返回值類型可以不用顯示寫出來交排。

3. 捕獲變量

c++和c#不一樣划滋,想在閉包里面使用外部變量,就必須先在捕獲變量列表里面定義埃篓。有下面幾種定義可供選擇处坪。
[]沒有捕獲任何變量
[=] 按值類型捕獲Lambda 所在范圍內(nèi)所有可見的局部變量
[&] 按引用類型捕獲Lambda 所在范圍內(nèi)所有可見的局部變量
[a] 按值類型捕獲a變量
[&a] 按引用類型捕獲a變量
[&,a] 值類型捕獲a,引用類型捕獲其余變量
[=,&a] 引用類型捕獲a架专,其余按值類型捕獲
[this] 可以使用 Lambda 所在類中的成員變量同窘。
當(dāng)然參數(shù)也可以是多個(gè),比如[a,b,c,&d] [&a,b,&c,d]這樣都是可以的。
注意一點(diǎn)部脚,變量捕獲是在lambda表達(dá)式被創(chuàng)建的時(shí)候想邦。

4. 函數(shù)指針

函數(shù)指針就是即指向函數(shù)的指針。
定義格式一般是 返回值類型(函數(shù)指針名字)(參數(shù))委刘,例如 int (p)(int) double (p)(string) void(*p)(int)都是正確的函數(shù)指針定義丧没。
下面看一個(gè)向函數(shù)指針傳遞lambda的例子:

int main()
{
      FunctionTest();
      system("pause");
      return 0;
}
void FunctionTest()
{
    FuncPtrTest([](int b) {cout << b << endl; return b; });
}
void FuncPtrTest(int (*p)(int) )
{
    p(1);
}

輸出結(jié)果為 1,在這里我們并沒有用到變量捕獲钱雷,事實(shí)上c++不允許往函數(shù)指針傳遞lambda的時(shí)候進(jìn)行變量捕獲骂铁。下面介紹function。

5. function

類模板std :: function是一個(gè)通用的多態(tài)函數(shù)包裝器罩抗。 std :: function的實(shí)例可以存儲(chǔ)拉庵,復(fù)制和調(diào)用任何可調(diào)用的目標(biāo) :包括函數(shù),lambda表達(dá)式套蒂,綁定表達(dá)式或其他函數(shù)對(duì)象钞支,以及指向成員函數(shù)和指向數(shù)據(jù)成員的指針茫蛹。(這句話是我抄的)
function聲明格式 function<返回值(變量類型)>,例如function<int(int)>烁挟,function<void(int)>都是function的正確聲明婴洼。

void FunctionTest()
{
  int a = 0;

  function<void(int)> func1 = [a](int b)->void { cout<<"func1\t" << "a=" << a << "\t" << "b=" << b << endl; };

  func1(5);
}

上面定義了一個(gè)返回值為void,接受一個(gè)int類型參數(shù)的function函數(shù)模板撼嗓,右邊是一個(gè)lambda表達(dá)式柬采,值類型捕獲a,輸出的結(jié)果是func1 a=0 b=5且警。

再看下面一種情況

void FunctionTest()
{
    int a = 0;

    function<void(int)> func1 = [a](int b)->void { cout<<"func1\t" << "a=" << a << "\t" << "b=" << b << endl; };

    function<int(int)> func2 = [a](int b)->int {cout << "func2\t"; return a + b; };

    func1(5);

    cout << func2(5) << endl;
}

定義了一個(gè)返回值為void粉捻,接受一個(gè)int類型參數(shù)的function函數(shù)模板,顯式返回a+b的值斑芜,輸出5肩刃;

再看下面的情況

void FunctionTest()
{
    int a = 0;

    function<void(int)> func1 = [a](int b)->void { cout<<"func1\t" << "a=" << a << "\t" << "b=" << b << endl; };

    function<int(int)> func2 = [a](int b)->int {cout << "func2\t"; return a + b; };

    function<void(int)> func3 = [&a](int b) {cout << "func3\t" << a + b << endl; a += 5; };

    cout << a << endl;

    func1(5);
    func3(5);
    cout << func2(5) << endl;
}

定義了一個(gè)返回值為void,按引用捕獲a變量杏头,接受一個(gè)int類型參數(shù)的function函數(shù)模板盈包,隱式返回void,輸出5醇王,并且在最后改變了a的值a+=5呢燥。

細(xì)心的同學(xué)會(huì)發(fā)現(xiàn),明明先調(diào)用了func3厦画,后調(diào)用func2疮茄,為什么2還是輸出5,那是因?yàn)椴东@變量發(fā)生在lambda被創(chuàng)建的時(shí)候根暑,把func2改成按類型捕獲力试,或者將func3的聲明和調(diào)用放到func2的前面,都會(huì)輸出10排嫌。這一點(diǎn)還是要多多注意

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末畸裳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子淳地,更是在濱河造成了極大的恐慌怖糊,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颇象,死亡現(xiàn)場(chǎng)離奇詭異伍伤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)遣钳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門扰魂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事劝评〗阒保” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵蒋畜,是天一觀的道長(zhǎng)声畏。 經(jīng)常有香客問我,道長(zhǎng)姻成,這世上最難降的妖魔是什么插龄? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮佣渴,結(jié)果婚禮上辫狼,老公的妹妹穿的比我還像新娘初斑。我一直安慰自己辛润,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布见秤。 她就那樣靜靜地躺著砂竖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鹃答。 梳的紋絲不亂的頭發(fā)上乎澄,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音测摔,去河邊找鬼置济。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锋八,可吹牛的內(nèi)容都是我干的浙于。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼挟纱,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼羞酗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起紊服,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤檀轨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后欺嗤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體参萄,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年煎饼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了讹挎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖淤袜,靈堂內(nèi)的尸體忽然破棺而出痒谴,到底是詐尸還是另有隱情,我是刑警寧澤铡羡,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布积蔚,位于F島的核電站,受9級(jí)特大地震影響烦周,放射性物質(zhì)發(fā)生泄漏尽爆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一读慎、第九天 我趴在偏房一處隱蔽的房頂上張望漱贱。 院中可真熱鬧,春花似錦夭委、人聲如沸幅狮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崇摄。三九已至,卻和暖如春慌烧,著一層夾襖步出監(jiān)牢的瞬間逐抑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工屹蚊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厕氨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓汹粤,卻偏偏與公主長(zhǎng)得像命斧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玄括,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351