函數模闆
執行個體:
template <class Any> //結尾不帶分号,寫在函數原型之前。
void swap(Any &a,Any &b);
void main(){ .....;}
template <class Any> //定義模闆和函數。結尾不帶分号。
void swap(Any &a,Any &b){ ......;}
第一行指出要建立一個模闆,并将類型命名為Any。關鍵字template和class是必需的,或者用關鍵字typename 代替class。
另外,必須使用尖括号。類型名可以任意選擇(這裡為Any),隻要遵守C++命名規則即可。
模闆不建立任何函數,隻是告訴編譯器如何定義函數。編譯器按模闆模式建立這樣的函數,并用實參類型替代Any。
關鍵字typename加入時間比較新,有大量的代碼庫是使用關鍵字class開發的。如果不考慮向後相容的問題,并願意輸入較長的單詞,則聲明類型參數時,應使用關鍵字typename而不使用class
注意:函數模闆并不能縮短可執行程式。編譯器将根據實際調用時的實參類型,來建立不同的函數定義。是以可以看做是函數重載的便捷實作方法。最終的代碼也不包含任何模闆。
函數模闆的重載
可以像重載正常函數定義那樣重載模闆定義,被重載的模闆的函數特征标必須不同。
執行個體:
template <class Any> //結尾不帶分号,寫在函數原型之前。
void swap(Any &a,Any &b);
template <class Any>
void swap(Any *a,Any *b,int n);
//最後一個參數使用具體類型,而不是通用類型。并非所有的模闆參數都必須是模闆參數類型。
void main(){ .....;}
template <class Any> //定義模闆和函數。結尾不帶分号。
void swap(Any &a,Any &b){ .....; }
template <class Any>
void swap(Any *a,Any *b,int n){ .......;}
具體化函數定義——顯示具體化(explicit specialization)
當遇到特定類型參數,需要改變函數模闆定義時,可以使用該方法。例如當參數類型為job結構時,采用不同的處理方法。
以下實作需要 <第三代具體化(ISO/ANSI C++标準)>支援:
1、對于給定的函數名,可以有非模闆函數、模闆函數和顯示具體化模闆函數以及它們的重載版本。
2、顯示具體化的原型和定義應以template<>打頭,并通過名稱來指出類型。
3、具體化将覆寫正常模闆,而非模闆函數将覆寫具體化和正常模闆。(表明正常函數處于最高優先級,之後是顯示具體化,最後是正常模闆。)
執行個體:
template<class Any>
void swap(Any &,Any &b); //正常模闆
struct job{ ......}; //定義一個結構
template <> void swap<job>(job &,job &); //顯示具體化.
//swap<job>中的<job>是可選的,因為函數的參數類型表明,這是job的一個具體化。
//是以該原型可寫為:template <> void swap(job &,job &);
void main(){ ......;}
template<class Any>
void swap(Any &,Any &b){......;} //定義正常模闆
template <> void swap<job>(job &,job &){......;} //定義一個參數類型為job的具體化實作方法