C++中function的實(shí)現(xiàn)原理詳解
前言
類模版std::function是一種通用、多態(tài)的函數(shù)封裝。std::function的實(shí)例可以對(duì)任何可以調(diào)用的目標(biāo)實(shí)體進(jìn)行存儲(chǔ)、復(fù)制、和調(diào)用操作,這些目標(biāo)實(shí)體包括普通函數(shù)、Lambda表達(dá)式、函數(shù)指針、以及其它函數(shù)對(duì)象等。std::function對(duì)象是對(duì)C++中現(xiàn)有的可調(diào)用實(shí)體的一種類型安全的包裹(我們知道像函數(shù)指針這類可調(diào)用實(shí)體,是類型不安全的)。
通常std::function是一個(gè)函數(shù)對(duì)象類,它包裝其它任意的函數(shù)對(duì)象,被包裝的函數(shù)對(duì)象具有類型為T1, …,TN的N個(gè)參數(shù),并且返回一個(gè)可轉(zhuǎn)換到R類型的值。std::function使用 模板轉(zhuǎn)換構(gòu)造函數(shù)接收被包裝的函數(shù)對(duì)象;特別是,閉包類型可以隱式地轉(zhuǎn)換為std::function
自己實(shí)現(xiàn)function
#include <iostream> #include <string> using namespace std; template<typename T> class MyFunction3 { }; template<typename Ty, typename A1> class MyFunction3<Ty(A1)> { public: typedef Ty(*pFunction)(A1);//定義一個(gè)函數(shù)指針,指針指向的函數(shù)返回類型是Ty,有1個(gè)函數(shù)參數(shù) MyFunction3<Ty(A1)>(pFunction _pFunction) : _function(_pFunction) { } Ty operator()(A1 arg1) { return (*_function)(arg1); } private: pFunction _function; }; template<typename Ty,typename A1,typename A2> class MyFunction3<Ty(A1,A2)> { public: typedef Ty(*pFunction)(A1, A2);//定義一個(gè)函數(shù)指針,指針指向的函數(shù)返回類型是Ty,有兩個(gè)函數(shù)參數(shù) MyFunction3<Ty(A1, A2)>(pFunction _pFunction):_function(_pFunction) { } Ty operator()(A1 arg1, A2 arg2) { return (*_function)(arg1, arg2); } private: pFunction _function; }; void showMes(string mes) { cout << "showMes(string mes)=" << mes << endl; } int sum1(int x, int y) { cout << "sum1 "<<(x+y) << endl; return x + y; } int sum2(int x, int y) { cout << "sum2 " << (x + y) << endl; return x + y; } int main() { MyFunction3<int(int, int)> f1(sum1); f1(20,30); MyFunction3<void(string)> f2(showMes); f2("AAAA"); system("pause"); return 0; }
上面代碼我們實(shí)現(xiàn)了兩個(gè)模板的部分特例化
- class MyFunction3<Ty(A1)> 一個(gè)函數(shù)參數(shù)的
- class MyFunction3<Ty(A1,A2)> 兩個(gè)函數(shù)參數(shù)的
所以問題來了...三個(gè)參數(shù),四個(gè)參數(shù),五個(gè)參數(shù)等若干個(gè)參數(shù)的怎么辦?
可以使用C++11 可變參數(shù)類型, 具體如下
#include <iostream> #include <string> using namespace std; template<typename T> class MyFunction4 { }; template<typename R , typename... A > class MyFunction4<R(A...)> { public: typedef R(*PFUNCTION)(A...); MyFunction4<R(A...)>(PFUNCTION _p) : function(_p) {} R operator()(A... arg) { return (*function)(arg...); } private: PFUNCTION function; }; void showMes1(string mes) { cout << "showMes(string mes)=" << mes << endl; } int sum11(int x, int y) { cout << "sum11 " << (x + y) << endl; return x + y; } int sum21(int x, int y) { cout << "sum21 " << (x + y) << endl; return x + y; } int main() { MyFunction4<int(int, int)> f1(sum11); f1(20, 30); MyFunction4<void(string)> f2(showMes1); f2("AAAA"); system("pause"); return 0; }
到此這篇關(guān)于C++中function的實(shí)現(xiàn)原理詳解的文章就介紹到這了,更多相關(guān)C++ function原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++開發(fā)protobuf動(dòng)態(tài)解析工具
這篇文章主要為大家介紹了C++開發(fā)protobuf動(dòng)態(tài)解析工具實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01OpenMP中For Construct對(duì)dynamic的調(diào)度方式詳解
在本篇文章當(dāng)中主要給大家介紹 OpenMp for construct 的實(shí)現(xiàn)原理,與他相關(guān)的動(dòng)態(tài)庫(kù)函數(shù)分析以及對(duì) dynamic 的調(diào)度方式進(jìn)行分析,希望對(duì)大家有所幫助2023-02-02OpenCV透視變換應(yīng)用之書本視圖矯正+廣告屏幕切換
透視變換是指利用透視中心、像點(diǎn)、目標(biāo)點(diǎn)三點(diǎn)共線的條件,按透視旋轉(zhuǎn)定律使承影面繞跡線旋轉(zhuǎn)某一角度,破壞原有的投影光線束,仍能保持承影面上投影幾何圖形不變的變換。本文將為大家介紹兩個(gè)OpenCV透視變換應(yīng)用,需要的可以參考一下2022-08-08一起來學(xué)習(xí)C++的動(dòng)態(tài)內(nèi)存管理
這篇文章主要為大家詳細(xì)介紹了C++的動(dòng)態(tài)內(nèi)存管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03C++ 網(wǎng)絡(luò)連通性檢測(cè)的實(shí)現(xiàn)方法
這篇文章主要介紹了C++ 網(wǎng)絡(luò)連通性檢測(cè)的實(shí)現(xiàn)方法的相關(guān)資料,這里提供實(shí)例幫助大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09