C++11 學(xué)習(xí)筆記之std::function和bind綁定器
std::function
C++中的可調(diào)用對象雖然具有比較統(tǒng)一操作形式(除了類成員指針之外,都是后面加括號進行調(diào)用),但定義方法五花八門。為了統(tǒng)一泛化函數(shù)對象,函數(shù)指針,引用函數(shù),成員函數(shù)的指針的各種操作,讓我們可以按更統(tǒng)一的方式寫出更加泛化的代碼,C++11推出了std::function。
std::function是可調(diào)用對象的包裝器。它是一個類模板,可以容納除了類成員(函數(shù))指針之外的所有可調(diào)用對象。通過指定它的模板參數(shù),它可以用統(tǒng)一的方式處理函數(shù),函數(shù)對象,函數(shù)指針,并允許保存和延遲執(zhí)行它們。
1.1 可調(diào)用對象(Callable Objects)
可調(diào)用對象有如下幾種:
- 函數(shù)指針
- 具有operator()成員函數(shù)的類對象(仿函數(shù))
- 可被轉(zhuǎn)換為函數(shù)指針的類對象
- 類成員(函數(shù))指針
以上涉及的對象可以像一個函數(shù)一樣做調(diào)用操作,統(tǒng)稱為可調(diào)用對象。現(xiàn)在,C++11通過提供std::function和std::bind統(tǒng)一了可調(diào)用對象的各種操作。
1.2 可調(diào)用對象包裝器——std::function
C++中的可調(diào)用對象雖然具有比較統(tǒng)一操作形式(除了類成員指針之外,都是后面加括號進行調(diào)用),但定義方法五花八門。為了統(tǒng)一泛化函數(shù)對象,函數(shù)指針,引用函數(shù),成員函數(shù)的指針的各種操作,讓我們可以按更統(tǒng)一的方式寫出更加泛化的代碼,C++11推出了std::function。
std::function是可調(diào)用對象的包裝器。它是一個類模板,可以容納除了類成員(函數(shù))指針之外的所有可調(diào)用對象。通過指定它的模板參數(shù),它可以用統(tǒng)一的方式處理函數(shù),函數(shù)對象,函數(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(){ //綁定一個普通函數(shù) std::function<void(void)> fry = func; fry(); //綁定一個類的靜態(tài)成員函數(shù) std::function<int(int)> fr2 = Foo::foo_func; cout << fr2(123) << endl; //綁定一個仿函數(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ù)簽名(即一個函數(shù)類型,只需要包括返回值和參數(shù)表)之后,它就變成了一個可以容納所有這一類調(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ù)封裝,它的實例可以對任何可以調(diào)用的目標(biāo)實體進行存儲、復(fù)制和調(diào)用操作,它也是對 C++中現(xiàn)有的可調(diào)用實體的一種類型安全的包裹(相對來說,函數(shù)指針的調(diào)用不是類型安全的),換句話說,就是函數(shù)的容器。當(dāng)我們有了函數(shù)的容器之后便能夠更加方便的將函數(shù)、函數(shù)指針作為對象進行處理。例如:lambda函數(shù)
到此這篇關(guān)于C++11 學(xué)習(xí)筆記之std::function和bind綁定器的文章就介紹到這了,更多相關(guān)C++11 std::function和bind綁定器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Matlab利用垂距法實現(xiàn)提取離散坐標(biāo)數(shù)據(jù)特征點
垂距法是指根據(jù)中間頂點到其前、后兩相鄰頂點連線的距離的大小,來確定是否保留該頂點的一種線要素頂點壓縮算法。本文將利用這一算法實現(xiàn)提取離散坐標(biāo)數(shù)據(jù)特征點,需要的可以參考下2022-04-04利用C語言實現(xiàn)“百馬百擔(dān)”問題方法示例
百馬百擔(dān)是道經(jīng)典的算法題,下面這篇文章主要給大家介紹了利用C語言實現(xiàn)“百馬百擔(dān)”問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12C/C++詳解實現(xiàn)二層轉(zhuǎn)發(fā)
數(shù)據(jù)鏈路層是開放系統(tǒng)互連 (OSI) 模型中的第二層,該層用于通過 LAN 等單一網(wǎng)絡(luò)進行通信的節(jié)點,第二層數(shù)據(jù)包不能從一個網(wǎng)絡(luò)傳輸?shù)搅硪粋€網(wǎng)絡(luò)。而二層轉(zhuǎn)發(fā)是根據(jù)報文的目的MAC直接進行轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)過程中不用對報文的頭部做任何的修改2022-05-05