C++中function的實現(xiàn)原理詳解
前言
類模版std::function是一種通用、多態(tài)的函數(shù)封裝。std::function的實例可以對任何可以調(diào)用的目標實體進行存儲、復(fù)制、和調(diào)用操作,這些目標實體包括普通函數(shù)、Lambda表達式、函數(shù)指針、以及其它函數(shù)對象等。std::function對象是對C++中現(xiàn)有的可調(diào)用實體的一種類型安全的包裹(我們知道像函數(shù)指針這類可調(diào)用實體,是類型不安全的)。
通常std::function是一個函數(shù)對象類,它包裝其它任意的函數(shù)對象,被包裝的函數(shù)對象具有類型為T1, …,TN的N個參數(shù),并且返回一個可轉(zhuǎn)換到R類型的值。std::function使用 模板轉(zhuǎn)換構(gòu)造函數(shù)接收被包裝的函數(shù)對象;特別是,閉包類型可以隱式地轉(zhuǎn)換為std::function
自己實現(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);//定義一個函數(shù)指針,指針指向的函數(shù)返回類型是Ty,有1個函數(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);//定義一個函數(shù)指針,指針指向的函數(shù)返回類型是Ty,有兩個函數(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; }
上面代碼我們實現(xiàn)了兩個模板的部分特例化
- class MyFunction3<Ty(A1)> 一個函數(shù)參數(shù)的
- class MyFunction3<Ty(A1,A2)> 兩個函數(shù)參數(shù)的
所以問題來了...三個參數(shù),四個參數(shù),五個參數(shù)等若干個參數(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的實現(xiàn)原理詳解的文章就介紹到這了,更多相關(guān)C++ function原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
OpenMP中For Construct對dynamic的調(diào)度方式詳解
在本篇文章當中主要給大家介紹 OpenMp for construct 的實現(xiàn)原理,與他相關(guān)的動態(tài)庫函數(shù)分析以及對 dynamic 的調(diào)度方式進行分析,希望對大家有所幫助2023-02-02OpenCV透視變換應(yīng)用之書本視圖矯正+廣告屏幕切換
透視變換是指利用透視中心、像點、目標點三點共線的條件,按透視旋轉(zhuǎn)定律使承影面繞跡線旋轉(zhuǎn)某一角度,破壞原有的投影光線束,仍能保持承影面上投影幾何圖形不變的變換。本文將為大家介紹兩個OpenCV透視變換應(yīng)用,需要的可以參考一下2022-08-08C++ 網(wǎng)絡(luò)連通性檢測的實現(xiàn)方法
這篇文章主要介紹了C++ 網(wǎng)絡(luò)連通性檢測的實現(xiàn)方法的相關(guān)資料,這里提供實例幫助大家實現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09