首先,我們給出模板函式和模板類的定義:
template void swap(t& a, t& b)
template class myclass ;
double dnum = 12.2;
double dnum2 = 4.4;
swap(dnum, dnum2);
myclassmyobj;
需要注意的一點,隱式例項化時,編譯器在需要物件之前,不會生成類的定義。
myclass*myobjptr; //只是類的指標,還沒有生成物件
myobjptr = new myclass; //現在才生成了乙個類物件
在第二條語句,即new之後,編譯器才根據通用模板來生成類的定義,並根據該定義建立了乙個物件。
顯式例項化 ,使用的關鍵字叫做 template 。
template void swap(int, int);
template class myclass;
在這種情況下,雖然沒有建立或提及類物件,但是編譯器也將會生成類定義。和隱式例項化一樣,顯式例項化也將根據通用模板來生成定義。
顯式特化,有些地方也翻譯為 顯式具體化,指的是同乙個內容。使用的關鍵字為 template<> 。
因為有時候,對於特殊型別例項化時,我們需要的行為與通用模板的定義不太一致。此時,就要用到顯式特化(explicit specialization)。
template<> void swap(int&, int &);
//or
template<> void swap(int&, int &);
template<>
class myclass
注意,在同乙個檔案或轉換單元中,使用同一種型別的顯式例項化和顯式特化將會編譯出錯。即不能對相同的型別,同時使用explicit instantiation和explicit specialization。
最後,還要講一點,這一點也很重要。
部分特化可以給型別引數之一指定具體的型別:
//general template
template class pair ;
//partial specialization with t2 set to int
template class pair;
關鍵字template後面的<>宣告的是沒有被特化的型別引數。因此,上述第二個宣告將t2特化為int,但t1保持不變。注意,如果指定所有的型別,那麼<>將為空,這就變成了顯式特化(explicit specialization)。
C 模板的例項化與模板的特化,顯示特化示例。
模板例項化 從通用版本中實現乙個特化版本的實現,如將函式模板顯式特化。模板特化 指定編譯器呼叫哪一種型別的實現 先看 乙個最簡單的模板形式,如下。template typename t t max t a,t b 我們知道這乙個模板可以將任意兩個型別相同並且可以使用 進行比較的變數進行比較,並且可以...
模板與模板特化
當某一類函式函式功能相同,而只是函式引數型別不同時,可以採用函式模板,以簡化 同樣的,當類只是成員函式的型別及函式引數型別和資料成員的型別不同時,我們也可以使用類模板對其進行泛化。template t add const t t1,const t t2 當模板的泛化處理不適合摸個特定的資料型別時,可...
類模板的特化和函式模板的過載與類模板的繼承
類似於函式模板的特化,類模板的特化也是在類模板定義以後,用template來說明乙個模板的特化型別,特化的類模板甚至可以定義新的資料成員和成員函式,下面就是乙個類模板特化的例子 include template class a t compute template class a int compu...