模板函式:模板函式代表的是乙個函式家族,模板函式和型別無關。在模板函式使用的時候被例項化,根據例項化引數的型別產生函式的特定型別版本。
要使用函式模板,用到的關鍵字是template,定義模板引數列表的形式:template,這裡的class可以換成typename,t是模板形參的名稱。
這裡可以使用class來替換typename,但是不可以使用struct來替換,這也是class和struct不同點之一。
舉個栗子:
templatet add(t left,t right)
這裡可以利用這個模板函式實現乙個通用的加法函式,但是這個函式僅限於實現同種型別的資料相加,如果要實現乙個int和char型別的加法,這個函式是實現不了的。如果要實現不同型別見得加法可以在模板函式的引數列表的位置新增乙個模板形參。如:
templatet1 add(t1 left,t2 right)
注:這裡t2前面的typename關鍵字不可省略,同時這個typename可以使用class更換。
模板機制:
在模板函式裡面模板就是一張藍圖,並沒有實際的函式存在,當使用特定的型別的資料呼叫時候就會根據實際引數的型別來對這個模板函式進行例項化,產生適合所需型別的函式。
舉個栗子:
templatet1 add(t1 left,t2 right)
void test()
templatet1 add(t1 left,t2 right)
注:過載的函式必須放在模板函式的前面。
當我們定義了模板函式的過載函式,那麼我們在呼叫和過載函式相同型別的實參的時候編譯器會自己優先呼叫過載的函式,而不會優先呼叫模板函式,
如果需要呼叫模板函式,只需要在呼叫的是偶在函式名稱後面新增<>或者《型別名》,這樣編譯器就會優先去呼叫模板函式。
模板函式的特化:
模板函式特化的呼叫形式:
template<>
int compare(const char *dst,const char *src)
注:特化的宣告必須和特定的模板函式相匹配。在函式呼叫的時候實參需要和特化的函式形參完全角同,如果不同編譯器就會例項化出乙個函式。
通過這麼特化的模板函式,那麼就可以例項化出特定的函式,這樣就可以完成特定的函式功能。
模板函式總結
使用模板函式可以將處理資料的演算法進行泛化。泛化的好處是可以將一種演算法應用到多種不同的資料上,從而避免相同邏輯的無意義重複,減少 量。但是對於某些型別應用某個函式模板可能並不合適,此時就可以針對該資料型別對函式模板進行特化處理。在程式使用函式模板,實際上是使用該模板的實列。在程式編譯過程中,編譯其...
C 入門基礎 十 模板 類模板 模板函式總結
emsp有句話是這麼說的 世界是由懶人創造的,在我們的計算機世界中同樣如此。我們之前說到,為了將同乙個功能的實現簡單化,我們學習了過載的相關知識,但是過載也有乙個缺陷,就是需要將不同型別的變數所對應的函式一 一寫出,就比如我們想要實現兩個數的交換,那麼問題來了,這個數有int double char...
C 模板總結
1 模板概念 模板是泛型程式設計的基礎。所謂泛型程式設計就是編寫與型別無關的邏輯 是一種復用的方式。模板分為模板函式和模板類。2 typename 與 class template 採用 class 來宣告模板 class template 採用 typename 來宣告模板 class 這兩種一般...