在《c++ primer》一書中,函式模板的具體化包括了三個部分:顯式具體化,隱式例項化與顯式例項化。
1.隱式例項化
隱式例項化是我們最常見的型別:根據定義的通用函式模板,編譯器按照呼叫的引數生成特定的模板。如有以下的模板定義:
template void myswap(t &a,t &b)
在其後的**塊中,如果函式呼叫int引數,編譯器就會根據模板生成myswap()函式的乙個例項:
int a=1,b=2;
myswap(a,b);
2.顯式例項化
最初,編譯器只能通過隱式例項化生成模板例項,現在允許在編譯階段生成模板函式的例項,而非執行階段。這種方式叫做顯式例項化。顯式例項化的書寫方法與隱式例項化存在一定的不同,仍以myswap()函式為例,如下所示:
template void myswap(char, char);
3.顯式具體化
模板函式自身有一定的侷限性。由於其採用對物件型別的泛化處理,導致其在內部實現的細節上無法保證對所有型別的通用性。如myswap()函式的設計目的是交換兩個物件,如果物件是標準資料型別,則直接交換它們的值即可。但如果物件是企業兩個員工的個人資訊,那麼實現起來就有很多的不同。為解決這一問題,c++中提供對模板的「特化」處理,即顯式具體化。顯式具體化的宣告如下:
template <> void myswap(double &, double &)
顯式具體化與顯式例項化書寫上的差別在於後者需要在template後新增乙個<>,另外引數型別中的引用符號不可以省略。在實際使用過程中,編譯器呼叫的順序是:顯式具體化》隱式例項化。同時,需要注意,不可以同時在乙個檔案中宣告同一型別的顯式例項化與顯式具體化,否則編譯器會報錯。
類模板具體化的分類與函式模板有相似也有不同。除了隱式例項化,顯式例項化與顯式具體化之外,在《c++ primer》一書中還提到一種部分具體化。
1.隱式例項化
類模板隱式例項化的含義與函式模板隱式例項化的含義接近,即根據定義好的類模板,由編譯器按照指定的引數型別生成具體的類定義。如有下列的類定義:
template class myclass
;};
當出現如下的呼叫形式時:
int a=1,b=2;
myclasst(a,b);
即代表所謂的隱式例項化。值得注意的是:myclass並不是乙個類,只有當它與特定的型別相關聯時,才成為乙個類,就如上面的myclass。
2.顯式例項化
類模板的顯式例項化與函式模板的顯式例項化含義基本一致,即使沒有宣告或者建立類物件,編譯器也會自動生成類的宣告。類模板的顯式例項化宣告格式如下所示:
template class myclass;
3.顯式具體化
類模板顯式具體化的含義與函式模板顯式具體化的含義相似,當類模板的引數為特定型別時,類行為會與類模板的定義有所不同,需要對其進行「特化」。這就是類模板的顯式具體化。仍然以myclass()類為例,其顯式具體化的定義如下所示:
template <> class myclass;
區別就在於後者在template後面加上了乙個<>。當編譯器遇上宣告為:myclassm;的變數時,會呼叫顯式具體化中的實現。同樣,在同一段程式中不可以同時出現對同一種型別的顯式例項化與顯式具體化的定義。
4.部分具體化
類模板的引數往往有多個,如果需要對部分引數具體化的類的行為進行定義,則將用到部分具體化。在侯捷老師的《stl 原始碼剖析》一書中又將其稱為「偏特化」。其宣告即是在顯式具體化的基礎上將部分模板引數變為抽象型別,如下:
template class myclass;
如果有多個可供選擇的模板,編譯器將選擇具體化程度最高。如下面四個例子,分別對應了上面的四種宣告與定義:
myclassm(1,0); //隱式例項化
myclassr(1,0); //顯式例項化
myclassc; //顯式具體化
myclassd; //部分具體化
C 函式模板的具體化
一 函式模板的具體化 先看看c 98裡面有關具體化方法的標註 在函式模板中會有三個常見形式 隱式例項化 顯式例項化 顯式具體化 特殊化 1 隱式例項化即常規的模板函式,宣告以後它只是生成乙個模板並不會生成函式定義。編譯器接受乙個特定型別為函式生成定義,如下方程式清單中的swap i,j 這種和例項化...
C 函式模板 模板例項化 具體化
函式模板是c 新增的一種性質,它允許只定義一次函式的實現,即可使用不同型別的引數來呼叫該函式。這樣做可以減小 的書寫的複雜度,同時也便於修改 注 使用模板函式並不會減少最終可執行程式的大小,因為在呼叫模板函式時,編譯器都根據呼叫時的引數型別進行了相應例項化 下面來看看函式模板的使用過程 struct...
C 函式模板 模板例項化 具體化
c 函式模板 模板例項化 具體化 函式模板是c 新增的一種性質,它允許只定義一次函式的實現,即可使用不同型別的引數來呼叫該函式。這樣做可以減小 的書寫的複雜度,同時也便於修改 注 使用模板函式並不會減少最終可執行程式的大小,因為在呼叫模板函式時,編譯器都根據呼叫時的引數型別進行了相應例項化 下面來看...