模板的特化

  提起模板,那我們有必要先了解一下泛型編程。

 泛型編程:編寫與類型無關的邏輯代碼,是代碼複用的一種手段。模板是泛型編程的基礎。

 模板又分爲:類模板和函數模板。

 首先看類模板的特化:

 類模板的特化分爲:全特化和部分特化。下面舉例說明:

#include<iostream>
using namespace std;
template <typename T1,typename T2>
class Data
{
public:
	Data()
	{
        cout << "Data(T1,T2)" << endl;
	}
	
private:
	T1 t1;
	T2 t2;
};

template <>//全特化
class Data<int, double >
{
public:
	Data()
	{
       cout<<" Data(int, double)" << endl;
	}
private:
	int d1;
	double d2;
};

template <typename T>//部分特化
class Data<T, int >
{
public:
	Data()
	{
		cout << "Data(T,int)" << endl;
	}
private:
	T t1;
	int d1;
};

int main()
{
	Data<int, double> d1;//全特化
	Data<char, int> d2;//部分特化
	Data<int, double> d3;//類模板
	Data<int, char> d4;//類模板
	return 0;
}

 運行結果如下圖:

       wKioL1cWI9jSKMbJAAAjzuuTbVM467.png

  接下來關於函數模板的特化:

  對於函數模板,卻只有全特化,不能偏特化

  模板函數特化形式如下:

   1、關鍵字template後面接一對空的尖括號<>

   2、再接模板名和一對尖括號,尖括號中指定這個特化定義的模板形參

   3、函數形參表

   4、函數體

 舉例如下:

 

template <typename T>//模板函數
int  Compare(T t1, T t2)
{
	if (t1 < t2)
		return 1;
	if (t1 >t2)
		return -1;
	return 0;
		
}

template <>//全特化
int Compare<const char *>(const char * p1, const char *  p2)
{
	return strcmp(p1, p2);
}

int main()
{
	const char *str1 = "1234";
	const char *str2 = "abcd";
	char *str3 = "1234";
	char *str4 = "abcd";
	cout << Compare(str1, str2) << endl;//全特化
	cout << Compare(str3, str4) << endl;//模板函數
	return 0;
}

注意:在模板特化版本的調用中,實參類型必須與特化版本函數的形參類型完全匹配,如果不匹配,編     譯器將爲實參模板定義中實例化一個實例。


     


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章