最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中function的實現(xiàn)原理詳解

 更新時間:2022年12月09日 10:30:46   作者:Hello_Bugs  
類模版std::function是一種通用、多態(tài)的函數(shù)封裝。function的實例可以對任何可以調(diào)用的目標實體進行存儲、復(fù)制、和調(diào)用操作。本文主要聊聊它的實現(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)文章

最新評論

淮北市| 衡山县| 渑池县| 汕尾市| 巩义市| 措勤县| 石楼县| 政和县| 会宁县| 栾川县| 巧家县| 襄汾县| 云和县| 永仁县| 冀州市| 宝应县| 龙州县| 虞城县| 兴义市| 偏关县| 河南省| 江孜县| 同心县| 多伦县| 石家庄市| 宁海县| 常熟市| 淮安市| 潞城市| 柳林县| 梁河县| 瑞丽市| 淅川县| 南宫市| 疏勒县| 平利县| 砚山县| 莱阳市| 精河县| 方城县| 望都县|