天天看點

函數模闆、模闆重載、函數模闆顯示具體化(explicit specialization)

函數模闆

執行個體:

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的具體化實作方法