C++ std::function的用法詳解
類模版std::function
是一種通用、多態(tài)的函數(shù)封裝。std::function
的實(shí)例可以對任何可以調(diào)用的目標(biāo)實(shí)體進(jìn)行存儲、復(fù)制、和調(diào)用操作,這些目標(biāo)實(shí)體包括普通函數(shù)、Lambda表達(dá)式、函數(shù)指針、以及其它函數(shù)對象等。std::function
對象是對C++中現(xiàn)有的可調(diào)用實(shí)體的一種類型安全的包裹(我們知道像函數(shù)指針這類可調(diào)用實(shí)體,是類型不安全的)。
通常std::function是一個(gè)函數(shù)對象類,它包裝其它任意的函數(shù)對象,被包裝的函數(shù)對象具有類型為T1, …,TN的N個(gè)參數(shù),并且返回一個(gè)可轉(zhuǎn)換到R類型的值。std::function
使用 模板轉(zhuǎn)換構(gòu)造函數(shù)接收被包裝的函數(shù)對象;特別是,閉包類型可以隱式地轉(zhuǎn)換為std::function
。
#include <iostream> #include <vector> #include <list> #include <map> #include <set> #include <string> #include <algorithm> #include <functional> #include <memory> using namespace std; //聲明一個(gè)模板 typedef std::function<int(int)> Functional; //normal function int TestFunc(int a) { return a; } //lambda expression auto lambda = [](int a)->int{return a;}; //functor仿函數(shù) class Functor { public: int operator() (int a) { return a; } }; //類的成員函數(shù)和類的靜態(tài)成員函數(shù) class CTest { public: int Func(int a) { return a; } static int SFunc(int a) { return a; } }; int main(int argc, char* argv[]) { //封裝普通函數(shù) Functional obj = TestFunc; int res = obj(0); cout << "normal function : " << res << endl; //封裝lambda表達(dá)式 obj = lambda; res = obj(1); cout << "lambda expression : " << res << endl; //封裝仿函數(shù) Functor functorObj; obj = functorObj; res = obj(2); cout << "functor : " << res << endl; //封裝類的成員函數(shù)和static成員函數(shù) CTest t; obj = std::bind(&CTest::Func, &t, std::placeholders::_1); res = obj(3); cout << "member function : " << res << endl; obj = CTest::SFunc; res = obj(4); cout << "static member function : " << res << endl; return 0; }
對于各個(gè)可調(diào)用實(shí)體轉(zhuǎn)換成std::function類型的對象,上面的代碼都有,運(yùn)行一下代碼,閱讀一下上面那段簡單的代碼??偨Y(jié)了簡單的用法以后,來看看一些需要注意的事項(xiàng):
- 關(guān)于可調(diào)用實(shí)體轉(zhuǎn)換為std::function對象需要遵守以下兩條原則:
- 轉(zhuǎn)換后的std::function對象的參數(shù)能轉(zhuǎn)換為可調(diào)用實(shí)體的參數(shù);
- 可調(diào)用實(shí)體的返回值能轉(zhuǎn)換為std::function對象的返回值。
- std::function對象最大的用處就是在實(shí)現(xiàn)函數(shù)回調(diào),使用者需要注意,它不能被用來檢查相等或者不相等,但是可以與NULL或者nullptr進(jìn)行比較。
為什么要用std::function
好用并實(shí)用的東西才會加入標(biāo)準(zhǔn)的。因?yàn)楹糜?,?shí)用,我們才在項(xiàng)目中使用它。std::function實(shí)現(xiàn)了一套類型消除機(jī)制,可以統(tǒng)一處理不同的函數(shù)對象類型。以前我們使用函數(shù)指針來完成這些;現(xiàn)在我們可以使用更安全的std::function來完成這些任務(wù)。
還有為什么?我也不知道還有為什么?等以后發(fā)現(xiàn)了更好的實(shí)際應(yīng)用實(shí)例再回來說為什么吧。
總結(jié)
C++11的加入,貌似讓C++變了一個(gè)語言似的,也有了Lambda表達(dá)式,好多東西都要去學(xué)習(xí),好多新的語言特性。
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
VC基于ADO技術(shù)訪問數(shù)據(jù)庫的方法
這篇文章主要介紹了VC基于ADO技術(shù)訪問數(shù)據(jù)庫的方法,較為詳細(xì)的分析了VC使用ADO操作數(shù)據(jù)庫的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10c語言實(shí)現(xiàn)學(xué)生管理系統(tǒng)詳解
這篇文章主要為大家介紹了c語言實(shí)現(xiàn)學(xué)生管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>2021-12-12C++中int?main(int?argc,?char**?argv)的參數(shù)使用
int?main(int?argc,?char**?argv)?是C和C++程序的入口點(diǎn),其中argc和argv是用來接收從命令行傳遞給程序的參數(shù)的,本文就來介紹一下這兩個(gè)參數(shù)的含義,感興趣的可以了解一下的相關(guān)資料2024-01-01Ubuntu中使用VS Code與安裝C/C++插件的教程詳解
這篇文章主要介紹了Ubuntu中使用VS Code與安裝C/C++插件的教程詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09C語言使用普通循環(huán)方法和遞歸求斐波那契序列示例代碼
這篇文章主要介紹了C語言使用普通循環(huán)方法和遞歸求斐波那契序列示例代碼,大家參考使用吧2013-11-11深入解析設(shè)計(jì)模式中的適配器模式在C++中的運(yùn)用
這篇文章主要介紹了設(shè)計(jì)模式中的適配器模式在C++中的運(yùn)用,通常適配器模式可以細(xì)分為類適配器和對象適配器兩種情況,需要的朋友可以參考下2016-03-03