C++11 學(xué)習(xí)筆記之std::function和bind綁定器
std::function
C++中的可調(diào)用對(duì)象雖然具有比較統(tǒng)一操作形式(除了類成員指針之外,都是后面加括號(hào)進(jìn)行調(diào)用),但定義方法五花八門。為了統(tǒng)一泛化函數(shù)對(duì)象,函數(shù)指針,引用函數(shù),成員函數(shù)的指針的各種操作,讓我們可以按更統(tǒng)一的方式寫出更加泛化的代碼,C++11推出了std::function。
std::function是可調(diào)用對(duì)象的包裝器。它是一個(gè)類模板,可以容納除了類成員(函數(shù))指針之外的所有可調(diào)用對(duì)象。通過指定它的模板參數(shù),它可以用統(tǒng)一的方式處理函數(shù),函數(shù)對(duì)象,函數(shù)指針,并允許保存和延遲執(zhí)行它們。
1.1 可調(diào)用對(duì)象(Callable Objects)
可調(diào)用對(duì)象有如下幾種:
- 函數(shù)指針
- 具有operator()成員函數(shù)的類對(duì)象(仿函數(shù))
- 可被轉(zhuǎn)換為函數(shù)指針的類對(duì)象
- 類成員(函數(shù))指針
以上涉及的對(duì)象可以像一個(gè)函數(shù)一樣做調(diào)用操作,統(tǒng)稱為可調(diào)用對(duì)象。現(xiàn)在,C++11通過提供std::function和std::bind統(tǒng)一了可調(diào)用對(duì)象的各種操作。
1.2 可調(diào)用對(duì)象包裝器——std::function
C++中的可調(diào)用對(duì)象雖然具有比較統(tǒng)一操作形式(除了類成員指針之外,都是后面加括號(hào)進(jìn)行調(diào)用),但定義方法五花八門。為了統(tǒng)一泛化函數(shù)對(duì)象,函數(shù)指針,引用函數(shù),成員函數(shù)的指針的各種操作,讓我們可以按更統(tǒng)一的方式寫出更加泛化的代碼,C++11推出了std::function。
std::function是可調(diào)用對(duì)象的包裝器。它是一個(gè)類模板,可以容納除了類成員(函數(shù))指針之外的所有可調(diào)用對(duì)象。通過指定它的模板參數(shù),它可以用統(tǒng)一的方式處理函數(shù),函數(shù)對(duì)象,函數(shù)指針,并允許保存和延遲執(zhí)行它們。
#include <iostream> #include <functional> using namespace std; void func(void){ cout << __FUNCTION__ <<endl; } class Foo { public: static int foo_func(int a){ cout << __FUNCTION__ << "(" << a << ") ->: "; return a; } }; class Bar { public: int operator()(int a){ cout << __FUNCTION__ << "(" << a << ") ->: "; return a; } }; int main(){ //綁定一個(gè)普通函數(shù) std::function<void(void)> fry = func; fry(); //綁定一個(gè)類的靜態(tài)成員函數(shù) std::function<int(int)> fr2 = Foo::foo_func; cout << fr2(123) << endl; //綁定一個(gè)仿函數(shù) Bar bar; fr2 = bar; cout << fr2(123) <<endl; return 0; }
root@ubuntu:~/c++# g++ -std=c++11 func1.cpp -o func root@ubuntu:~/c++# ./func func foo_func(123) ->: 123 operator()(123) ->: 123 root@ubuntu:~/c++#
std::function的使用方法:我們給std::function填入合適的函數(shù)簽名(即一個(gè)函數(shù)類型,只需要包括返回值和參數(shù)表)之后,它就變成了一個(gè)可以容納所有這一類調(diào)用方式的“函數(shù)包裝器”。
#include <iostream> #include <functional> using namespace std; class A { public: A(const std::function<void()>& f) :callback_(f){} void notify(void){ callback_(); } private: std::function<void()> callback_; }; class Foo { public: void operator()(void){ cout <<"in " << __FUNCTION__<< endl; } }; int main(){ Foo foo; A aa(foo); aa.notify(); return 0; }
"func2.cpp" 32L, 452C written root@ubuntu:~/c++# g++ -std=c++11 func2.cpp -o func root@ubuntu:~/c++# ./func in operator()
C++11 std::function 是一種通用、多態(tài)的函數(shù)封裝,它的實(shí)例可以對(duì)任何可以調(diào)用的目標(biāo)實(shí)體進(jìn)行存儲(chǔ)、復(fù)制和調(diào)用操作,它也是對(duì) C++中現(xiàn)有的可調(diào)用實(shí)體的一種類型安全的包裹(相對(duì)來說,函數(shù)指針的調(diào)用不是類型安全的),換句話說,就是函數(shù)的容器。當(dāng)我們有了函數(shù)的容器之后便能夠更加方便的將函數(shù)、函數(shù)指針作為對(duì)象進(jìn)行處理。例如:lambda函數(shù)
到此這篇關(guān)于C++11 學(xué)習(xí)筆記之std::function和bind綁定器的文章就介紹到這了,更多相關(guān)C++11 std::function和bind綁定器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談時(shí)間戳與日期時(shí)間互轉(zhuǎn)C語言
下面小編就為大家?guī)硪黄獪\談時(shí)間戳與日期時(shí)間互轉(zhuǎn)C語言。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06Matlab利用垂距法實(shí)現(xiàn)提取離散坐標(biāo)數(shù)據(jù)特征點(diǎn)
垂距法是指根據(jù)中間頂點(diǎn)到其前、后兩相鄰頂點(diǎn)連線的距離的大小,來確定是否保留該頂點(diǎn)的一種線要素頂點(diǎn)壓縮算法。本文將利用這一算法實(shí)現(xiàn)提取離散坐標(biāo)數(shù)據(jù)特征點(diǎn),需要的可以參考下2022-04-04C語言代碼實(shí)現(xiàn)簡(jiǎn)易三子棋游戲
這篇文章主要為大家詳細(xì)介紹了C語言代碼實(shí)現(xiàn)簡(jiǎn)易三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法示例
百馬百擔(dān)是道經(jīng)典的算法題,下面這篇文章主要給大家介紹了利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12C++面向?qū)ο髮?shí)現(xiàn)萬年歷的示例代碼
本文將通過面向?qū)ο髮?shí)現(xiàn)一個(gè)簡(jiǎn)單的日歷(萬年歷)效果,主要會(huì)有以下幾個(gè)模塊:模型、視圖、控制,感興趣的小伙伴可以動(dòng)手嘗試一下2022-06-06C/C++詳解實(shí)現(xiàn)二層轉(zhuǎn)發(fā)
數(shù)據(jù)鏈路層是開放系統(tǒng)互連 (OSI) 模型中的第二層,該層用于通過 LAN 等單一網(wǎng)絡(luò)進(jìn)行通信的節(jié)點(diǎn),第二層數(shù)據(jù)包不能從一個(gè)網(wǎng)絡(luò)傳輸?shù)搅硪粋€(gè)網(wǎng)絡(luò)。而二層轉(zhuǎn)發(fā)是根據(jù)報(bào)文的目的MAC直接進(jìn)行轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)過程中不用對(duì)報(bào)文的頭部做任何的修改2022-05-05