C++ std::function詳解
一、介紹
std::function是函數(shù)模板類(是一個(gè)類)。包含在#include <functional> 中。以前沒有這個(gè)類的時(shí)候,我們在想定義一個(gè)回調(diào)函數(shù)指針,非常的麻煩。我們通常這樣的定義:
typedef void(*ptr)(int,int)// 這里的ptr就是一個(gè)函數(shù)指針
而使用了std::function這個(gè)類的時(shí)候,我們可以這樣使用,來替換函數(shù)指針。例如:
std::function<void(int ,int)> func;
std::function 的實(shí)例能存儲、復(fù)制及調(diào)用任何可調(diào)用 (Callable) 目標(biāo)——函數(shù)、 lambda 表達(dá)式、 bind 表達(dá)式或其他函數(shù)對象,還有指向成員函數(shù)指針和指向數(shù)據(jù)成員指針。
它也是對 C++ 中現(xiàn)有的可調(diào)用實(shí)體的一種類型安全的包裹(相對來說,函數(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)用對象,生成一個(gè)新的可調(diào)用對象來“適應(yīng)”原對象的參數(shù)列表。
std::bind將可調(diào)用對象與其參數(shù)一起進(jìn)行綁定,綁定后的結(jié)果可以使用std::function保存。std::bind主要有以下兩個(gè)作用:
- 將可調(diào)用對象和其參數(shù)綁定成一個(gè)仿函數(shù);
- 只綁定部分參數(shù),減少可調(diào)用對象傳入的參數(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é)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++調(diào)用C函數(shù)報(bào)錯(cuò)無法解析的外部命令/無法解析的外部符號問題
這篇文章主要介紹了C++調(diào)用C函數(shù)報(bào)錯(cuò)無法解析的外部命令/無法解析的外部符號問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08Cocos2d-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é)過的常變量,雖然是變量,也有自己的地址,但是一經(jīng)賦初值,便不能再被修改2013-10-10C++基于OpenCV實(shí)現(xiàn)手勢識別的源碼
這篇文章主要介紹了C++基于OpenCV手勢識別的實(shí)現(xiàn)源碼,這里用到背景減法模型知識,具體實(shí)例代碼跟隨小編一起看看吧2021-09-09