聊一聊C++bind函數(shù)使用
總述
最近寫代碼的時候看到代碼使用了bind,一個參數(shù)綁定的標(biāo)準(zhǔn)庫函數(shù)。程序是這么寫的, speaker_play_routine_ = new boost::thread
(boost::bind(&Speaker::playRoutine, this)); 這是我們一個語音播放的一行代碼。
其中 boost::thread是新建一個線程,線程執(zhí)行函數(shù)是Speaker::playRoutine,執(zhí)行函數(shù)被bind綁定函數(shù)可以修改普通函數(shù)來構(gòu)造bind對象,bind函數(shù)的第二個參數(shù)是this(this 是 C++ 中的一個關(guān)鍵字,也是一個 const 指針,它指向當(dāng)前對象,通過它可以訪問當(dāng)前對象的所有成員)是Speaker::playRoutine類函數(shù)的參數(shù)。
短短的一行代碼,實際上考驗了一個人對C++的掌握深度,好了話不多說,進(jìn)入今天的介紹,c++ bind綁定函數(shù)。
1.使用由來
我們看到我使用的代碼是boost :: bind,而大家在網(wǎng)上看到的大部分介紹是標(biāo)準(zhǔn)函數(shù)std :: bind,其實boost :: bind是標(biāo)準(zhǔn)函數(shù)std :: bind1st和std :: bind2nd的泛化。它支持任意函數(shù)對象,函數(shù),函數(shù)指針和成員函數(shù)指針,并且能夠?qū)⑷魏螀?shù)綁定到特定值或?qū)⑤斎雲(yún)?shù)路由到任意位置。bind對函數(shù)對象沒有任何要求; 特別地,它不需要result_type,first_argument_type和second_argument_type標(biāo)準(zhǔn)typedef。
2.使用介紹
通常我們可以將bind函數(shù)看作一個通用的函數(shù)適配器,它接受一個可調(diào)用對象,生成一個新的可調(diào)用對象來“適應(yīng)”原對象的參數(shù)列表。bind可以根據(jù)當(dāng)前已有的可調(diào)用對象,構(gòu)造出一個新的可調(diào)用對象,有了bind,我們可以實現(xiàn)“動態(tài)生成新的函數(shù)”的功能。簡而言之,就是可以通過bind函數(shù)修改原函數(shù)并生成一個可以被調(diào)用的對象,類似于函數(shù)的重載,但是我們又不需要去重新寫一個函數(shù),用bind函數(shù)就可以實現(xiàn)。
接下來我們看看bind函數(shù)是如何使用的呢?
綁定一個普通函數(shù)和函數(shù)指針:
- int fun(int a, int b,int c,int d,int e)
- {
- return a + b - c + d - e;
- }
- int main()
- {
- int x=1,y=2,z=3;
- auto g =bind(fun,x,y,_2,z,_1);
- }
這樣的g 是一個有兩個參數(shù)的可調(diào)用對象,它的兩個參數(shù)分別用占位符_2 和_1表示。這個新的可調(diào)用對象將它自己的參數(shù)作為第三個和第五個傳遞給fun,fun函數(shù)的第一個、第二個第四個參數(shù)分別被綁定到給定的值x、y、z上。
綁定一個成員函數(shù):
bind最常用的功能之一,是由類成員函數(shù)構(gòu)造bind對象;想想看,如何由類成員函數(shù)(非static成員函數(shù))構(gòu)造回調(diào)函數(shù)?答案是很難,而通過bind,卻可以很容易做到。
- class Speaker {
- public
- Speaker();
- ~Speaker()
- {
- speaker_play_routine_->join();
- }
- void playRoutine()
- {
- }
- private
- boost::thread* speaker_play_routine_{nullptr};
- };
- int main()
- {
- speaker_play_routine_ = new boost::thread(boost::bind(&Speaker::playRoutine, this));
- }
這里類的成員函數(shù)必須通過類的對象或者指針調(diào)用,因此在綁定時,bind要拿出第一個參數(shù)的位置來指定一個類的實例、指針或者引用。
注意:必須在成員函數(shù)前面加上取地址的操作符&。
參考文章:https://www.boost.org/doc/libs/1_65_1/libs/bind/doc/html/bind.html#bind.purpose.using_bind_with_functions_and_fu
本文轉(zhuǎn)載自微信公眾號「羽林君」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系羽林君公眾號。