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

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

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

所以問(wèn)題來(lái)了...三個(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)文章

最新評(píng)論

射洪县| 黄冈市| 道孚县| 葫芦岛市| 澎湖县| 永胜县| 石狮市| 鲁甸县| 双柏县| 新竹市| 镇坪县| 迭部县| 综艺| 万盛区| 安庆市| 临猗县| 岢岚县| 平乐县| 泰安市| 本溪| 遂溪县| 子洲县| 东乡县| 济南市| 富民县| 德阳市| 米泉市| 呼伦贝尔市| 汉源县| 富锦市| 彰武县| 大田县| 抚松县| 奉化市| 岳阳县| 如东县| 杨浦区| 株洲县| 金塔县| 察哈| 珲春市|