一.函數模板
1.顯示實例化(explicit instantiation)和顯示具體化(explicit specialization)的區別:
(1) 形式上:
顯示實例化: template void Swap<int> (int ,int);
顯示具體化: template <> void Swap<int> (int,int);
或 template<> void Swap (int,int);
從中我們可以看出區別在於前者以 template 打頭,後者以template<> 打頭
(2) 含義上:
顯示實例化:使用 Swap() 模板生成 int 類型的函數定義,即使用函數模板,用具體的 int 來代替函數模板中的泛型類型,這樣就不用額外寫函數定義。
顯示具體化:不使用Swap()模板生成函數定義,而使用專門的、獨立的(即顯示具體化所定義的函數)函數定義來顯示的為 int 類型生成函數定義,顯示具體化要有額外的函數定義部分。
2.隱式實例化(implicit instantiation)比較簡單,它是在函數調用時根據參數的具體類型來確定函數模板中的泛型類型。如:
char ch1,ch2;
……
Swap(ch1,ch2);// 此時用char 類型來替換函數模板中的通用類型
3.顯示實例化,隱式實例化和顯示具體化統稱為具體化(specialization),它們的相同之處在於都是用具體的類型的函數定義,而不是通用描述。
二.類模板
1. 顯示實例化和顯示具體化的區別
(1)形式上:
顯示實例化: template class ArrayTp<string,10> ;
顯示具體化: template <class T, int n>
class ArrayTp
{
……
……
};
template <> class ArrayTp<string,10>
{
……
……
};
從中可以看出,二者的區別類似於函數模板中二者的區別,一個以template 打頭,一個以template <> 打頭,但都要有class 關鍵字,因為這是類模板。
(2) 含義上:
顯示實例化用通用的類模板ArrayTp生成具體類型(如string)的類定義;
顯示具體化不使用類模板定義,而使用自己專用的類定義。
2.部分具體化(partial specialization)
部分具體話,是指部分限制模板的通用性。
如 有以下模板定義:
template <class T1, class T2>
class Pair
{
……
};
可以這樣實現部分具體化:
template <class T2> class Pair<string,T2>
{
……
};
template 後面的<> 出現的是未具體化的類型參數。若兩個參數都具體化了,則<>內為空,就變成了顯示具體化。
3.隱式實例化比較簡單,它是在聲明對象時根據具體的類型來代替類模板中的通用類型。如: ArrayTp<double,10> aver;