C++ std::function詳解
一、介紹
std::function是函數(shù)模板類(是一個(gè)類)。包含在#include <functional> 中。以前沒(méi)有這個(gè)類的時(shí)候,我們?cè)谙攵x一個(gè)回調(diào)函數(shù)指針,非常的麻煩。我們通常這樣的定義:
typedef void(*ptr)(int,int)// 這里的ptr就是一個(gè)函數(shù)指針
而使用了std::function這個(gè)類的時(shí)候,我們可以這樣使用,來(lái)替換函數(shù)指針。例如:
std::function<void(int ,int)> func;
std::function 的實(shí)例能存儲(chǔ)、復(fù)制及調(diào)用任何可調(diào)用 (Callable) 目標(biāo)——函數(shù)、 lambda 表達(dá)式、 bind 表達(dá)式或其他函數(shù)對(duì)象,還有指向成員函數(shù)指針和指向數(shù)據(jù)成員指針。
它也是對(duì) C++ 中現(xiàn)有的可調(diào)用實(shí)體的一種類型安全的包裹(相對(duì)來(lái)說(shuō),函數(shù)指針的調(diào)用不是類型安全的)
二、實(shí)例
#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; }
運(yùn)行結(jié)果
三、與std::bind的區(qū)別
可將std::bind函數(shù)看作一個(gè)通用的函數(shù)適配器,它接受一個(gè)可調(diào)用對(duì)象,生成一個(gè)新的可調(diào)用對(duì)象來(lái)“適應(yīng)”原對(duì)象的參數(shù)列表。
std::bind將可調(diào)用對(duì)象與其參數(shù)一起進(jìn)行綁定,綁定后的結(jié)果可以使用std::function保存。std::bind主要有以下兩個(gè)作用:
- 將可調(diào)用對(duì)象和其參數(shù)綁定成一個(gè)仿函數(shù);
- 只綁定部分參數(shù),減少可調(diào)用對(duì)象傳入的參數(shù)。
double my_divide(double x, double y) { return x / y; }; int main(int argc, char* argv[]) { auto fn_half = std::bind(my_divide, std::placeholders::_1, 2); std::cout << fn_half(10) << '\n'; // 輸出為5 return 0; }
參考:
C++11 中的std::function和std::bind詳解
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++調(diào)用C函數(shù)報(bào)錯(cuò)無(wú)法解析的外部命令/無(wú)法解析的外部符號(hào)問(wèn)題
這篇文章主要介紹了C++調(diào)用C函數(shù)報(bào)錯(cuò)無(wú)法解析的外部命令/無(wú)法解析的外部符號(hào)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08深入解析C語(yǔ)言中常數(shù)的數(shù)據(jù)類型
C語(yǔ)言中常數(shù)的數(shù)據(jù)類型,需要的朋友可以過(guò)來(lái)參考下。希望對(duì)大家有所幫助2013-10-10C語(yǔ)言之結(jié)構(gòu)體(struct)詳解
本文主要介紹C語(yǔ)言 結(jié)構(gòu)體的知識(shí),學(xué)習(xí)C語(yǔ)言肯定需要學(xué)習(xí)結(jié)構(gòu)體,這里詳細(xì)說(shuō)明了結(jié)構(gòu)體并附示例代碼,供大家參考學(xué)習(xí),有需要的小伙伴可以參考下2021-10-10QT實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04Cocos2d-x學(xué)習(xí)筆記之Hello World源碼分析
這篇文章主要介紹了Cocos2d-x學(xué)習(xí)筆記之Hello World源碼分析,接上一篇內(nèi)容,本文著重分析源碼文件,需要的朋友可以參考下2014-09-09C++類中的常數(shù)據(jù)成員與靜態(tài)數(shù)據(jù)成員之間的區(qū)別
常數(shù)據(jù)成員是指在類中定義的不能修改其值的一些數(shù)據(jù)成員,類似于我們以前學(xué)過(guò)的常變量,雖然是變量,也有自己的地址,但是一經(jīng)賦初值,便不能再被修改2013-10-10C++基于OpenCV實(shí)現(xiàn)手勢(shì)識(shí)別的源碼
這篇文章主要介紹了C++基于OpenCV手勢(shì)識(shí)別的實(shí)現(xiàn)源碼,這里用到背景減法模型知識(shí),具體實(shí)例代碼跟隨小編一起看看吧2021-09-09