一讀就會 c 中模板例項化與具體化區別

2021-10-03 19:49:36 字數 1442 閱讀 1355

1、模板格式:不同於普通函式的是,模板函式需要加乙個頭:template

template //模板函式宣告

void change(t1& t1, t2& t2);

template //另一種形式的模板函式宣告

void change(t1& t1, t2& t2);

int mian()

template//模板函式定義

void change(t1& t1, t2& t2)

2、首先我們要樹立乙個概念:模板例項化後是物件,物件是類的例項化;模板具體化後仍是模板。

先來總覽一下模板例項化和模板具體化的種類。例項化分為隱式例項化和顯示例項化兩種,具體化只有顯式具體化一種,格式如下:

template//模板函式定義

void change(t1& t1, t2& t2)

template <> void change(int& t1, char& t2); //顯式具體化模板

templatevoid change(t1& t1, char& t2) //部分顯式具體化模板

int main()

3、為什麼要引入顯式具體化這種特性?

看下面的情況:若沒有顯式具體化,假設有如下模板函式:

templatet maxsize(t& a, t& b)   //將a, b的較大者輸出

該模板函式實現的功能是將a, b的較大者輸出,假設執行過程中會用到比較運算子」<「,若t的型別為int ,沒有問題;若t的型別為陣列型字串char*,則會出問題,我們希望的是比較陣列型字串儲存的內容,而實際執行過程中比較的是陣列型字串的儲存位址。針對這種情況,我們設計一種顯示具體化的方式,單獨定義這種情況,當遇到這種情況時,執行此單獨定義的函式,其他情況下執行模板類函式的定義。 

需要指出的是:顯式具體化的優先順序高於模板類函式,即當函式的引數與顯示具體化的引數完全相同時,會執行顯式具體化的定義而不會執行模板類函式的定義。

引入顯式具體化可以完美得解決上述問題。

templatet maxsize(t& a, t& b)   //將a, b的較大者輸出

template<> char* maxsize(char* a, char* b) //顯式具體化模板單獨定義特數情況

4、隱式例項化物件不夠用嗎,為什麼要引入顯式例項化物件?

依舊使用3中的 t maxsize(t a, t b)模板函式,看如下的情況:

template t maxsize(t a, t b)

int main()

由於a, b 型別不同,隱式模板不知道該按照誰的型別來,所以無法執行;但是顯式模板將a強制轉換為double型, 可以執行。

C 函式模板 模板例項化 具體化

函式模板是c 新增的一種性質,它允許只定義一次函式的實現,即可使用不同型別的引數來呼叫該函式。這樣做可以減小 的書寫的複雜度,同時也便於修改 注 使用模板函式並不會減少最終可執行程式的大小,因為在呼叫模板函式時,編譯器都根據呼叫時的引數型別進行了相應例項化 下面來看看函式模板的使用過程 struct...

C 函式模板 模板例項化 具體化

c 函式模板 模板例項化 具體化 函式模板是c 新增的一種性質,它允許只定義一次函式的實現,即可使用不同型別的引數來呼叫該函式。這樣做可以減小 的書寫的複雜度,同時也便於修改 注 使用模板函式並不會減少最終可執行程式的大小,因為在呼叫模板函式時,編譯器都根據呼叫時的引數型別進行了相應例項化 下面來看...

C 函式模板 模板例項化 具體化

原文 c 函式模板 模板例項化 具體化 函式模板是c 新增的一種性質,它允許只定義一次函式的實現,即可使用不同型別的引數來呼叫該函式。這樣做可以減小 的書寫的複雜度,同時也便於修改 注 使用模板函式並不會減少最終可執行程式的大小,因為在呼叫模板函式時,編譯器都根據呼叫時的引數型別進行了相應例項化 下...