提起模板,那咱們有必要先了解一下泛型編程。
ios
泛型編程:編寫與類型無關的邏輯代碼,是代碼複用的一種手段。模板是泛型編程的基礎。編程
模板又分爲:類模板和函數模板。ide
首先看類模板的特化:函數
類模板的特化分爲:全特化和部分特化。下面舉例說明:spa
#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; }
運行結果以下圖:
blog
接下來關於函數模板的特化:get
對於函數模板,卻只有全特化,不能偏特化it
模板函數特化形式以下:io
一、關鍵字template後面接一對空的尖括號<>模板
二、再接模板名和一對尖括號,尖括號中指定這個特化定義的模板形參
三、函數形參表
四、函數體
舉例以下:
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; }
注意:在模板特化版本的調用中,實參類型必須與特化版本函數的形參類型徹底匹配,若是不匹配,編 譯器將爲實參模板定義中實例化一個實例。