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

C++模板的特化超詳細(xì)精講

 更新時(shí)間:2022年08月03日 15:13:40   作者:Rookiep  
最近我學(xué)習(xí)了C++中的模板相關(guān)知識(shí),模板是泛型編程的基礎(chǔ),十分重要。所以特意整理出來(lái)一篇文章供我們一起復(fù)習(xí)和學(xué)習(xí)

一、泛型編程

我們前面已經(jīng)學(xué)過(guò)函數(shù)的重載,實(shí)現(xiàn)了在函數(shù)名相同的情況下,實(shí)現(xiàn)不同的功能!

例如:

void Swap(int& left, int& right)
{
	int temp = left;
	left = right;
	right = temp;
}
void Swap(double& left, double& right)
{
	double temp = left;
	left = right;
	right = temp;
}
void Swap(char& left, char& right)
{
	char temp = left;
	left = right;
	right = temp;
}

利用函數(shù)重載雖然實(shí)現(xiàn)了“通用”的交換函數(shù),但是會(huì)有以下問(wèn)題:

  • 重載的函數(shù)僅僅是類(lèi)型不同,代碼復(fù)用率低,只要有新的類(lèi)型時(shí),有需要用戶(hù)自己增加新的重載函數(shù)。
  • 代碼的可維護(hù)性低,一個(gè)出錯(cuò)可能所有的重載都出錯(cuò)。

??????:在C++中是否存在一個(gè)模具,通過(guò)給這個(gè)模具中填充不同的材料(類(lèi)型),來(lái)獲得不同的鑄件(即生成具體的代碼)。

泛型編程:編寫(xiě)與類(lèi)型無(wú)關(guān)的通用代碼,是代碼復(fù)用的一種的手段。模板是泛型編程的基礎(chǔ)。

二、函數(shù)模板

2.1、函數(shù)模板的概念

函數(shù)模板代表了一個(gè)函數(shù)家族,該函數(shù)模板與類(lèi)型無(wú)關(guān),在使用時(shí)被參數(shù)化,根據(jù)實(shí)參類(lèi)型產(chǎn)生函數(shù)的特定類(lèi)型版本。

2.2、函數(shù)模板的格式

template<typename T1, typename T2,…,typename Tn>

返回值類(lèi)型 函數(shù)名(參數(shù)列表){}

template<typename T>
void Swap(T& left, T& right)
{
	T temp = left;
	left = right;
	right = temp;
}

??注意:typename 是用來(lái)定義函數(shù)模板參數(shù)關(guān)鍵字的,也可以用class,但是不可以用struct。

2.3、函數(shù)模板的原理

函數(shù)模板我們可以理解為一個(gè)藍(lán)圖,它本身并不是函數(shù),在編譯器編譯階段根據(jù)傳入的實(shí)參類(lèi)型來(lái)推演生成對(duì)應(yīng)類(lèi)型的函數(shù)以供調(diào)用,也叫做函數(shù)模板的實(shí)例化。

2.4、函數(shù)模板的實(shí)例化

用不同類(lèi)型的對(duì)象使用函數(shù)模板時(shí),稱(chēng)為函數(shù)模板的實(shí)例化。模板參數(shù)實(shí)例化分為隱式實(shí)例化和顯示實(shí)例化。

2.4.1、隱式實(shí)例化

讓編譯器根據(jù)實(shí)參推演模板參數(shù)的實(shí)際類(lèi)型。

template<class T>
T Add(const T& left, const T& right)
{
	return left + right;
}
int main(){
	int a1 = 10, a2 = 20;
	double d1 = 10.0, d2 = 20.0;
	Add(a1, a2);
	Add(d1, d2);
	//Add(a1, d1);
	Add(a1, (int)d1);
	system("pause");
	return 0;
}

2.4.2、顯示實(shí)例化

讓函數(shù)名后的<>中指定模板參數(shù)的實(shí)際類(lèi)型。

int main(){
	int a = 10;
	double b = 20.0;
	//Add(a, (int)b);//隱式
	Add<int>(a, b);//顯示
	system("pause");
	return 0;
}

Add(a, b);目的在于如果類(lèi)型不匹配,編譯器會(huì)嘗試進(jìn)行隱式類(lèi)型轉(zhuǎn)換,如果無(wú)法轉(zhuǎn)換成功編譯器將會(huì)報(bào)錯(cuò)。

三、類(lèi)模板

3.1、類(lèi)模板的定義格式

template<typename T1, typename T2,…,typename Tn>

class 類(lèi)模板名

{

//類(lèi)內(nèi)成員

};

3.1、類(lèi)模板的實(shí)例化

類(lèi)模板實(shí)例化與函數(shù)模板實(shí)例化不同,類(lèi)模板實(shí)例化傳的是類(lèi)型,而函數(shù)模板實(shí)例化傳的是對(duì)象,類(lèi)模板實(shí)例化需要在類(lèi)模板名字后面跟上<>,然后將實(shí)例化類(lèi)型放在<>中即可!

vector<int> s1;

??:與普通類(lèi)不同,這里vector是類(lèi)名,而vector才是類(lèi)型。

四、模板的特化

4.1、概念

通常情況下,我們使用模板可以實(shí)現(xiàn)一些與類(lèi)型無(wú)關(guān)的代碼,但是對(duì)于一些特殊類(lèi)型可能會(huì)得到一些錯(cuò)誤的結(jié)果,需要特殊處理。

template<class T>
bool Less(T left, T right){
	return left < right;
}
//特化
template<>
bool Less<Date*>(Date* p1, Date* p2)
{
	cout << "調(diào)用的模板函數(shù)的特化" << endl;
	return *p1 < *p2;
}
//只要是指針  都可以調(diào)用這個(gè),這個(gè)思想很重要
//偏特化的帶限制條件(指針類(lèi)型可調(diào))
template<class T>
bool Less(T* left, T* right)
{
	cout << "調(diào)用的函數(shù)模板" << endl;
	return *left < *right;
}

代碼解釋?zhuān)寒?dāng)我們?cè)趯?shí)參部分傳的是Date型指針的時(shí)候,如果不特化處理,結(jié)果會(huì)出錯(cuò)。

上述就是在原模板的基礎(chǔ)上針對(duì)特殊類(lèi)型所進(jìn)行特殊化的實(shí)現(xiàn)方式。模板特化中分為函數(shù)模板特化和類(lèi)模板特化。

4.2、函數(shù)模板特化步驟

  • 必須要先有一個(gè)基礎(chǔ)的函數(shù)模板。
  • 關(guān)鍵字template后面接一隊(duì)空的<>。
  • 函數(shù)名后跟一對(duì)<>,尖括號(hào)中指定需要特化的類(lèi)型。
  • 函數(shù)形參表:必須要和模板函數(shù)的基礎(chǔ)參數(shù)類(lèi)型完全相同,如果不同編譯器可能會(huì)報(bào)一些奇怪的錯(cuò)誤。
template<class T>
bool Less(T left, T right){
	return left < right;
}
//特化
template<>
bool Less<Date*>(Date* p1, Date* p2)
{
	cout << "調(diào)用的模板函數(shù)的特化" << endl;
	return *p1 < *p2;
}

4.3、類(lèi)模板的特化

4.3.1、全特化

全特化就是將模板參數(shù)中所有的參數(shù)都確定化

//類(lèi)模板
template<class T1, class T2>
class data
{
public:
	data(T1 a, T2 b)
		:_a(a)
		, _b(b)
	{
		cout << "data<T1, T2>" << endl;
	}
private:
	T1 _a;
	T2 _b;
};
//全特化
template<>
class data <int, char>
{
public:
	data(int a, char b)
		:_a(a)
		, _b(b)
	{
		cout << "全特化data<int, char>" << endl;
	}
private:
	int _a;
	char _b;
};
int main()
{
	data<int, int> s1(1, 2);
	data<int, char> s2(1, 'a');
}

4.3.2、偏特化

偏特化:任何針對(duì)模板參數(shù)進(jìn)一步進(jìn)行條件限制設(shè)計(jì)的特化版本。比如對(duì)一下類(lèi)模板:

//類(lèi)模板
template<class T1, class T2>
class data{
public:
	data(T1 a, T2 b)
		:_a(a)
		, _b(b)
	{
		cout << "data<T1, T2>" << endl;
	}
private:
	T1 _a;
	T2 _b;
};

??????偏特化有以下兩種變現(xiàn)方式:

部分特化:將模板參數(shù)中的一部分參數(shù)特化

//半特化
// 1、將模板參數(shù)類(lèi)表中的一部分參數(shù)特化。
template<class T1>
class data<T1, char> {
public:
	data(T1 a, char b)
		:_a(a)
		, _b(b)
	{
		cout << "偏特化data<T1, char>" << endl;
	}
private:
	T1 _a;
	char _b;
};

參數(shù)進(jìn)一步限制:偏特化并不僅僅是指特化部分參數(shù),而是針對(duì)模板參數(shù)更進(jìn)一步的條件限制所設(shè)計(jì)出來(lái)的特化版本。

// 2、偏特化并不僅僅是指特化部分參數(shù),而是針對(duì)模板參數(shù)更進(jìn)一步的條件限制所設(shè)計(jì)出來(lái)的一個(gè)特化版本。
template<class T1, class T2>
class data <T1*, T2* > {
public:
	data(T1 a, char b)
		:_a(a)
		, _b(b)
	{
		cout << "Data<T1*, T2*>" << endl;
	}
private:
	T1 _a;
	T2 _b;
};
template<class T1, class T2>
class data<T1&, T2&>
{
public:
	data(const T1& a, const T2& b)
		:_a(a)
		, _b(b)
	{ cout << "Data<T1&, T2&>" << endl; }
private:
	const T1& _a;
	const T2& _b;
};
int main(){
	data<char*, char*> s6(1,2);
	data<int&, int&> s7(1, 2);
	system("pause");
	return 0;
}

代碼解釋?zhuān)?/p>

  • 第一個(gè)是兩個(gè)參數(shù)特例化為指針類(lèi)型(只要傳的是指針,就走對(duì)應(yīng)的)。
  • 第二個(gè)是兩個(gè)參數(shù)特例化為引用類(lèi)型。

到此這篇關(guān)于C++模板的特化超詳細(xì)精講的文章就介紹到這了,更多相關(guān)C++模板特化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于VC 6.0使用C語(yǔ)言實(shí)現(xiàn)俄羅斯方塊

    基于VC 6.0使用C語(yǔ)言實(shí)現(xiàn)俄羅斯方塊

    這篇文章主要為大家詳細(xì)介紹了基于VC 6.0使用C語(yǔ)言實(shí)現(xiàn)俄羅斯方塊,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 基于C++的拼多多算法在線(xiàn)筆試題示例

    基于C++的拼多多算法在線(xiàn)筆試題示例

    這篇文章主要介紹了基于C++的拼多多算法在線(xiàn)筆試題,列舉了四個(gè)拼多多的算法筆試題,包括分治法、大數(shù)相乘、貪心算法以及迷宮問(wèn)題,需要的朋友可以參考下
    2017-08-08
  • C++ Boost Bimap示例詳細(xì)講解

    C++ Boost Bimap示例詳細(xì)講解

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)
    2022-11-11
  • C++貪心算法實(shí)現(xiàn)活動(dòng)安排問(wèn)題(實(shí)例代碼)

    C++貪心算法實(shí)現(xiàn)活動(dòng)安排問(wèn)題(實(shí)例代碼)

    貪心算法(又稱(chēng)貪婪算法)是指,在對(duì)問(wèn)題求解時(shí),總是做出在當(dāng)前看來(lái)是最好的選擇。這篇文章主要介紹了C++貪心算法實(shí)現(xiàn)活動(dòng)安排問(wèn)題,需要的朋友可以參考下
    2019-11-11
  • C語(yǔ)言圖書(shū)借閱系統(tǒng)源碼

    C語(yǔ)言圖書(shū)借閱系統(tǒng)源碼

    這篇文章主要為大家分享了C語(yǔ)言圖書(shū)借閱系統(tǒng)源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • C語(yǔ)言如何正確的終止正在運(yùn)行的子線(xiàn)程

    C語(yǔ)言如何正確的終止正在運(yùn)行的子線(xiàn)程

    這篇文章主要介紹了C語(yǔ)言如何正確的終止正在運(yùn)行的子線(xiàn)程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • C++ Effective詳解

    C++ Effective詳解

    下面小編就為大家?guī)?lái)一篇C++ Effective的文章。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-08-08
  • 詳細(xì)對(duì)比C語(yǔ)言中的chmod()函數(shù)和fchmod()函數(shù)

    詳細(xì)對(duì)比C語(yǔ)言中的chmod()函數(shù)和fchmod()函數(shù)

    這篇文章主要介紹了C語(yǔ)言中的chmod()函數(shù)和fchmod()函數(shù)的詳細(xì)對(duì)比,兩個(gè)都是用于修改文件權(quán)限但是請(qǐng)注意實(shí)際使用上的差異,需要的朋友可以參考下
    2015-09-09
  • 學(xué)生成績(jī)管理系統(tǒng)C++實(shí)現(xiàn)代碼

    學(xué)生成績(jī)管理系統(tǒng)C++實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了學(xué)生成績(jī)管理系統(tǒng)C++實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++實(shí)現(xiàn)圖書(shū)管理系統(tǒng)課程設(shè)計(jì)(面向?qū)ο?

    C++實(shí)現(xiàn)圖書(shū)管理系統(tǒng)課程設(shè)計(jì)(面向?qū)ο?

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書(shū)管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評(píng)論

米易县| 尖扎县| 拉孜县| 乐陵市| 临泉县| 阜城县| 普洱| 朝阳区| 贺州市| 乌海市| 博乐市| 堆龙德庆县| 平罗县| 延边| 阿荣旗| 玉龙| 卓资县| 富锦市| 余干县| 郸城县| 新沂市| 河津市| 年辖:市辖区| 嘉荫县| 察隅县| 韶山市| 扎囊县| 郓城县| 天津市| 潜山县| 秀山| 巩留县| 石门县| 财经| 九台市| 河曲县| 康平县| 明光市| 肥乡县| 汨罗市| 同心县|