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

C++初階學(xué)習(xí)之模板進(jìn)階

 更新時(shí)間:2022年01月15日 16:08:16   作者:可口也可樂、  
這篇文章主要為大家介紹了C++模板進(jìn)階,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

一、非模板類型參數(shù)

分類:

模板參數(shù)分類類型形參與非類型形參

概念:

1.類型形參:

出現(xiàn)在模板參數(shù)列表中,跟在class或者typename之類的參數(shù)類型名稱

2.非類型形參:

用一個(gè)常量作為類(函數(shù))模板的一個(gè)參數(shù),在類(函數(shù))模板中可將該參數(shù)當(dāng)成常量來使用

示例:

namespace cole
{
	// 定義一個(gè)模板類型的靜態(tài)數(shù)組
	template<class T, size_t N = 10>
	class array
	{
	public:
		T& operator[](size_t index) 
		{ 
			return _array[index]; 
		}

		const T& operator[](size_t index)const 
		{ 
			return _array[index]; 
		}

		size_t size()const 
		{ 
			return _size; 
		}

		bool empty()const 
		{ 
			return 0 == _size; 
		}
	private:
		T _array[N];
		size_t _size;
	};
}

注意:

1.浮點(diǎn)數(shù)、類對象以及字符串是不允許作為非類型模板參數(shù)的

2.非類型的模板參數(shù)必須在編譯期就能確認(rèn)結(jié)果

二、模板特化

概念:

使用模板可以實(shí)現(xiàn)一些與類型無關(guān)的代碼,但對于一些特殊類型的可能會得到一些錯(cuò)誤的結(jié)果

示例:

template<class T>
bool IsEqual(const T& left, const T& right)
{
	return left == right;
}
// 函數(shù)模板的特化 (針對某些類型的特殊化處理)
//bool IsEqual(const char* const & left,const char* const & right)
bool IsEqual(const char* left, const char* right)
{
	return strcmp(left, right) == 0;
}
int main()
{
	cout << IsEqual(1, 2) << endl;
	char p1[] = "hello";
	char p2[] = "hello";
	cout << IsEqual(p1, p2) << endl;;
	return 0;
}

特殊化結(jié)果:

 

image-20220102174246490

 不做特殊化結(jié)果:

 image-20220102174324473

注:此時(shí)對于字符串比較就需要對模板進(jìn)行特化(在原模板類的基礎(chǔ)上,針對特殊類型所進(jìn)行特殊化的實(shí)現(xiàn)方式)

特化分類:

函數(shù)模板特化類模板特化

1、函數(shù)模板特化

函數(shù)模板的特化步驟:

  • 必須要先有一個(gè)基礎(chǔ)的函數(shù)模板
  • 關(guān)鍵字template后面接一對空的尖括號<>
  • 函數(shù)名后跟一對尖括號,尖括號中指定需要特化的類型
  • 函數(shù)形參表: 必須要和模板函數(shù)的基礎(chǔ)參數(shù)類型完全相同,如果不同編譯器可能會報(bào)一些奇怪的錯(cuò)誤

示例:

template<class T>
bool IsEqual(const T left, const T right)
{
	return left == right;
}
template<>
bool IsEqual<char*>(char* left,char* right)
{
	if (strcmp(left, right) == 0)
		return true;
	return false;
}

結(jié)果:

 image-20220102175925378

注:一般情況下如果函數(shù)模板遇到不能處理或者處理有誤的類型,為了實(shí)現(xiàn)簡單通常都是將該函數(shù)直接給出

示例:

bool IsEqual(char* left, char* right)
{
	if (strcmp(left, right) == 0)
		return true;
	return false;
}

2、類模板特化

1)全特化

概念:

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

示例:

template<class T1, class T2>
class Data
{
public:
	Data() { cout << "Data<T1, T2>" << endl; }
private:
	T1 _d1;
	T2 _d2;
};
template<>
class Data<int, char>
{
public:
	Data() { cout << "Data<int, char>" << endl; }
private:
	int _d1;
	char _d2;
};
void TestVector()
{
	Data<int, int> d1;
	Data<int, char> d2;
}

2)偏特化

概念:

任何針對模版參數(shù)進(jìn)一步進(jìn)行條件限制設(shè)計(jì)的特化版本

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

1.部分特化

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

示例:

// 將第二個(gè)參數(shù)特化為inttemplate <class T1>class Data<T1, int>{public:Data() { cout << "Data<T1, int>" << endl; }private:T1 _d1;int _d2;};// 將第二個(gè)參數(shù)特化為int
template <class T1>
class Data<T1, int>
{
public:
	Data() { cout << "Data<T1, int>" << endl; }
private:
	T1 _d1;
	int _d2;
};

2.參數(shù)更進(jìn)一步的限制

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

示例:

//兩個(gè)參數(shù)偏特化為指針類型template <typename T1, typename T2>class Data <T1*, T2*>{public:Data() { cout << "Data<T1*, T2*>" << endl; }private:T1 _d1;T2 _d2;};//兩個(gè)參數(shù)偏特化為引用類型template <typename T1, typename T2>class Data <T1&, T2&>{public:Data(const T1& d1, const T2& d2): _d1(d1), _d2(d2){cout << "Data<T1&, T2&>" << endl;}private:const T1& _d1;const T2& _d2;};void test2(){Data<double, int> d1; // 調(diào)用特化的int版本Data<int, double> d2; // 調(diào)用基礎(chǔ)的模板Data<int*, int*> d3; // 調(diào)用特化的指針版本Data<int&, int&> d4(1, 2); // 調(diào)用特化的指針版本}//兩個(gè)參數(shù)偏特化為指針類型
template <typename T1, typename T2>
class Data <T1*, T2*>
{
public:
	Data() { cout << "Data<T1*, T2*>" << endl; }
private:
	T1 _d1;
	T2 _d2;
};
//兩個(gè)參數(shù)偏特化為引用類型
template <typename T1, typename T2>
class Data <T1&, T2&>
{
public:
	Data(const T1& d1, const T2& d2)
		: _d1(d1)
		, _d2(d2)
	{
		cout << "Data<T1&, T2&>" << endl;
	}
private:
	const T1& _d1;
	const T2& _d2;
};
void test2()
{
	Data<double, int> d1; // 調(diào)用特化的int版本
	Data<int, double> d2; // 調(diào)用基礎(chǔ)的模板
	Data<int*, int*> d3; // 調(diào)用特化的指針版本
	Data<int&, int&> d4(1, 2); // 調(diào)用特化的指針版本
}

三、模板分離編譯

分離編譯概念:

一個(gè)程序(項(xiàng)目)由若干個(gè)源文件共同實(shí)現(xiàn),而每個(gè)源文件單獨(dú)編譯生成目標(biāo)文件,最后將所有目標(biāo)文件鏈接起來形成單一的可執(zhí)行文件的過程稱為分離編譯模式

模板分離編譯:

假如有以下場景,模板的聲明與定義分離開,在頭文件中進(jìn)行聲明,源文件中完成定義

示例:

// a.h
template<class T>
T Add(const T& left, const T& right);
// a.cpp
template<class T>
T Add(const T& left, const T& right)
{
	return left + right;
}
// main.cpp
#include"a.h"
int main()
{
	Add(1, 2);
	Add(1.0, 2.0);
	return 0;
}

注:以上代碼的模板分離編譯會報(bào)錯(cuò)

分析: 

image-20220102180953843

解決方法

1.將聲明和定義放到一個(gè)文件 “xxx.hpp” (h文件和cpp文件結(jié)合)里面或者xxx.h其實(shí)也是可以的(推薦)

2.模板定義的位置顯式實(shí)例化(不實(shí)用)

四、模板總結(jié)

優(yōu)點(diǎn):

  • 模板復(fù)用了代碼,節(jié)省資源,更快的迭代開發(fā),C++的標(biāo)準(zhǔn)模板庫(STL)因此而產(chǎn)生
  • 增強(qiáng)了代碼的靈活性

缺陷:

  • 模板會導(dǎo)致代碼膨脹問題,也會導(dǎo)致編譯時(shí)間變長(為了盡量減少此類問題,編譯器會按需實(shí)例化)
  • 出現(xiàn)模板編譯錯(cuò)誤時(shí),錯(cuò)誤信息非常凌亂,不易定位錯(cuò)誤
  • 不支持分離編譯

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • QT中進(jìn)程的創(chuàng)建實(shí)現(xiàn)

    QT中進(jìn)程的創(chuàng)建實(shí)現(xiàn)

    本文主要介紹了QT中進(jìn)程的創(chuàng)建實(shí)現(xiàn),詳細(xì)介紹了創(chuàng)建進(jìn)程的整個(gè)過程,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2023-08-08
  • C語言斷言函數(shù)assert()的學(xué)習(xí)筆記

    C語言斷言函數(shù)assert()的學(xué)習(xí)筆記

    在C語言庫函數(shù)中提供了一個(gè)輔助調(diào)試程序的小型庫,它是由assert()宏組成,本文就詳細(xì)的介紹了一下如何使用,感興趣的可以了解一下
    2021-11-11
  • C++?容器中map和unordered?map區(qū)別詳解

    C++?容器中map和unordered?map區(qū)別詳解

    這篇文章主要為大家介紹了C++?容器中map和unordered?map區(qū)別示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • C語言中的運(yùn)算符和結(jié)合性問題

    C語言中的運(yùn)算符和結(jié)合性問題

    這篇文章主要介紹了C語言中的運(yùn)算符和結(jié)合性問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • C語言數(shù)據(jù)結(jié)構(gòu)實(shí)例講解單鏈表的實(shí)現(xiàn)

    C語言數(shù)據(jù)結(jié)構(gòu)實(shí)例講解單鏈表的實(shí)現(xiàn)

    單鏈表是后面要學(xué)的雙鏈表以及循環(huán)鏈表的基礎(chǔ),要想繼續(xù)深入了解數(shù)據(jù)結(jié)構(gòu)以及C++,我們就要奠定好這塊基石!接下來就和我一起學(xué)習(xí)吧
    2022-03-03
  • c++ 成員函數(shù)與非成員函數(shù)的抉擇

    c++ 成員函數(shù)與非成員函數(shù)的抉擇

    盡量用類的非成員函數(shù)以及友元函數(shù)替換類的成員函數(shù) 例如一個(gè)類來模擬人People
    2013-01-01
  • C語言數(shù)據(jù)結(jié)構(gòu)之線索二叉樹及其遍歷

    C語言數(shù)據(jù)結(jié)構(gòu)之線索二叉樹及其遍歷

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之線索二叉樹及其遍歷的相關(guān)資料,為了加快查找節(jié)點(diǎn)的前驅(qū)和后繼。對二叉樹的線索化就是對二叉樹進(jìn)行一次遍歷,在遍歷的過程中檢測節(jié)點(diǎn)的左右指針是否為空,如果是空,則將他們改為指向前驅(qū)和后繼節(jié)點(diǎn)的線索,需要的朋友可以參考下
    2017-08-08
  • C++中運(yùn)算符重載詳解及其作用介紹

    C++中運(yùn)算符重載詳解及其作用介紹

    這篇文章主要介紹了C++中運(yùn)算符重載詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C語言二維數(shù)組幾種常用的表示方法

    C語言二維數(shù)組幾種常用的表示方法

    今天小編就為大家分享一篇關(guān)于C語言二維數(shù)組幾種常用的表示方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • C語言編程之三個(gè)方法實(shí)現(xiàn)strlen函數(shù)

    C語言編程之三個(gè)方法實(shí)現(xiàn)strlen函數(shù)

    本篇文章是C語言編程篇,主要為大家介紹C語言編程中實(shí)現(xiàn)strlen函數(shù)的三個(gè)方法講解,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09

最新評論

且末县| 汝州市| 枣庄市| 新野县| 伊春市| 罗定市| 新平| 马关县| 巴青县| 察哈| 万盛区| 阿克苏市| 西和县| 莱阳市| 衡阳县| 乐亭县| 石景山区| 鄂伦春自治旗| 厦门市| 舒兰市| 大同县| 桦川县| 隆尧县| 阿图什市| 阿坝| 宁强县| 贺州市| 邛崃市| 天台县| 深泽县| 汉寿县| 乌拉特前旗| 翁牛特旗| 新营市| 阜阳市| 清涧县| 贵溪市| 赤水市| 馆陶县| 兰考县| 富源县|