從cocos2dx回調(diào)看到的std::bind稍刀,和lambda表達(dá)式

昨天手動(dòng)binding C++的回調(diào)到Lua的時(shí)候撩独,用到了lambda表達(dá)式敞曹。今天專門看了一下cocos2dx的回調(diào)操作。都是個(gè)人筆記综膀,有問題歡迎指正澳迫, 不負(fù)任何法律責(zé)任,-_-
參考文章剧劝, 果凍想

1. 首先也是從這幾個(gè)回調(diào)開始看

#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)
#define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)

全是關(guān)于std::bind的宏定義橄登。因?yàn)閏ocos2dx中只會用到綁定成員函數(shù)的情況,所以讥此,這里只看一下拢锹,綁定成員函數(shù)的用法。

2.簡單看一下std::bind的源碼萄喳,在functional.h的頭文件中卒稳。

// TEMPLATE FUNCTION bind (implicit return type)沒有返回值
template<class _Fx,
    class... _Types> inline
    _Binder<_Unforced, _Fx, _Types...> bind(_Fx&& _Func, _Types&&... _Args)
    {   // bind a callable object with an implicit return type
    return (_Binder<_Unforced, _Fx, _Types...>(
        _STD forward<_Fx>(_Func), _STD forward<_Types>(_Args)...));
    }

    // TEMPLATE FUNCTION bind (explicit return type)有返回值的
template<class _Ret,
    class _Fx,
    class... _Types> inline
    _Binder<_Ret, _Fx, _Types...> bind(_Fx&& _Func, _Types&&... _Args)
    {   // bind a callable object with an explicit return type
    return (_Binder<_Ret, _Fx, _Types...>(
        _STD forward<_Fx>(_Func), _STD forward<_Types>(_Args)...));
    }

會發(fā)現(xiàn)下面還有一個(gè)枚舉,是關(guān)于參數(shù)占位符的枚舉他巨,一共20個(gè)充坑,所以用std::bind最多支持20個(gè)參數(shù)的函數(shù)的綁定。

3.綁定成員函數(shù)

這里主要是看綁定成員函數(shù)的基本用法:
首先染突,我有一個(gè)類捻爷,需要一個(gè)std::function的參數(shù)

#include<iostream>
#include <functional>

class MyClass
{
    
public:
    typedef std::function<void(std::string)> myCallBack;

    MyClass(std::string name);
    ~MyClass();
    std::string getName();
    void setName(std::string name);
    void printInfo();
    void setCallBack(myCallBack callBack); //需要一個(gè)std::function的方法
private:
    std::string _name;
    myCallBack _callBack;
};

然后看一下調(diào)用setCallBack的方法:

auto myClass = MyClass("12121");
myClass.setCallBack(std::bind(&HelloWorld::myClassCallBack/*函數(shù)名*/, this/*調(diào)用者*/, std::placeholders::_1/*參數(shù)*/));

因?yàn)閙yClassCallBack需要一個(gè)參數(shù),所以這里草穿進(jìn)去一個(gè)參數(shù)占位符份企,就可以接受調(diào)用過程中實(shí)際傳過來的參數(shù)了役衡。如果有多個(gè)參數(shù),就需要多個(gè)參數(shù)占位符薪棒。這里的參數(shù)占位符也可以替換成這種:

myClass.setCallBack(std::bind(&HelloWorld::myClassCallBack, this, "zzz test!!"));

這樣的話手蝎,下面的myClassCallBack中傳進(jìn)來的就是"zzz test!!",下面是成員函數(shù):

void HelloWorld::myClassCallBack(std::string str)
{
    CCLOG("===============   %s", str.c_str());
}

4.綁定非成員函數(shù)

綁定非成員函數(shù)的時(shí)候俐芯,可以把調(diào)用者去掉就可以了:

int add1(int i, int j, int k) {  
    return i + j + k;  
} 
auto add2 = std::bind(add1, std::placeholders::_1, std::placeholders::_2, 10);  
    // 函數(shù)add2 = 綁定add1函數(shù)棵介,參數(shù)1不變,參數(shù)2不變吧史,參數(shù)3固定為10.  

還有一個(gè)需要注意的地方就是參數(shù)占位符如果調(diào)換位置邮辽,在實(shí)際調(diào)用過程中,傳入?yún)?shù)也會調(diào)換位置贸营。這樣就比較靈活吨述,一個(gè)函數(shù)通過bind的時(shí)候調(diào)換參數(shù)的位置,設(shè)置可以實(shí)現(xiàn)函數(shù)重載的功能钞脂。

5.然后接上面的看一下lambda表達(dá)式設(shè)置回調(diào)

auto func = [](std::string str) {
        CCLOG("==========lambda=======%s", str.c_str());
    };
myClass.setCallBack(func);

這個(gè)就比較簡單了揣云,具體lambda的用法,以后用到了再深究吧

lambda表達(dá)式基本用法

1)聲明Lambda表達(dá)式

Lambda表達(dá)式完整的聲明格式如下:

[capture list] (params list) mutable exception-> return type { function body }

各項(xiàng)具體含義如下

  • capture list:捕獲外部變量列表
  • params list:形參列表
  • mutable指示符:用來說用是否可以修改捕獲的變量
  • exception:異常設(shè)定
  • return type:返回類型
  • function body:函數(shù)體
2)具體用法
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    vector<int> myvec{ 3, 2, 5, 7, 3, 2 };
    sort(myvec.begin(), myvec.end(), [](int a, int b) -> bool { return a < b; });   // Lambda表達(dá)式
    cout << "lambda expression:" << endl;
    for (int it : myvec)
        cout << it << ' ';
}
3)捕獲外部變量

[]:默認(rèn)不捕獲任何變量冰啃;
[=]:默認(rèn)以值捕獲所有變量邓夕;
[&]:默認(rèn)以引用捕獲所有變量刘莹;
[x]:僅以值捕獲x,其它變量不捕獲焚刚;
[&x]:僅以引用捕獲x点弯,其它變量不捕獲;
[=, &x]:默認(rèn)以值捕獲所有變量矿咕,但是x是例外抢肛,通過引用捕獲;
[&, x]:默認(rèn)以引用捕獲所有變量碳柱,但是x是例外雌团,通過值捕獲;
[this]:通過引用捕獲當(dāng)前對象(其實(shí)是復(fù)制指針)士聪;
[*this]:通過傳值方式捕獲當(dāng)前對象;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猛蔽,一起剝皮案震驚了整個(gè)濱河市剥悟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌曼库,老刑警劉巖区岗,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異毁枯,居然都是意外死亡慈缔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門种玛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來藐鹤,“玉大人,你說我怎么就攤上這事赂韵∮榻冢” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵祭示,是天一觀的道長肄满。 經(jīng)常有香客問我,道長质涛,這世上最難降的妖魔是什么稠歉? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮汇陆,結(jié)果婚禮上怒炸,老公的妹妹穿的比我還像新娘。我一直安慰自己毡代,他們只是感情好横媚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布纠炮。 她就那樣靜靜地躺著,像睡著了一般灯蝴。 火紅的嫁衣襯著肌膚如雪恢口。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天穷躁,我揣著相機(jī)與錄音耕肩,去河邊找鬼。 笑死问潭,一個(gè)胖子當(dāng)著我的面吹牛猿诸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播狡忙,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼梳虽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了灾茁?” 一聲冷哼從身側(cè)響起窜觉,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎北专,沒想到半個(gè)月后禀挫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拓颓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年语婴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驶睦。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡砰左,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出场航,到底是詐尸還是另有隱情菜职,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布旗闽,位于F島的核電站酬核,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏适室。R本人自食惡果不足惜嫡意,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捣辆。 院中可真熱鬧蔬螟,春花似錦、人聲如沸汽畴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鲁猩,卻和暖如春坎怪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背廓握。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工搅窿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隙券。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓男应,卻偏偏與公主長得像,于是被迫代替她去往敵國和親娱仔。 傳聞我的和親對象是個(gè)殘疾皇子沐飘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容