什麼是模板?
就是告訴編譯器一個模子,讓編譯器根據不一樣的類型生成不一樣的代碼。
編寫與類型無關的函數,是代碼複用的一種手段。
函數模板數組
template<typename T> void Swap( T& left, T& right) { T temp = left; left = right; right = temp; }
用這種方式定義函數模板就完成了代碼的複用,模板函數工做的原理就是在編譯階段編譯器對傳入的實參進行推演出合適的函數ide
模板函數的實例化
分爲顯示實例化和隱式實例化函數
隱式實例化:讓編譯器根據實參推演模板參數的實際類型,當所傳的參數類型編譯器沒法進行推演時(模板類型只有一個而實參類型有多個),有兩種處理方式:1.類型轉化 2.顯示實例化code
顯式實例化:在函數名後的<>中指定模板參數的實際類型對象
注意:一個非模板函數能夠和一個同名的函數模板同時存在,並且該函數模板還能夠被實例化爲這個非模板函數
,當模板函數和同名自定義函數同時存在時優先調用自定義函數,能夠經過顯式調用來調用模板函數,
模板函數不容許自動類型轉換,普通函數能夠
字符串
一樣的類模板與其相同原理編譯器
模板參數分爲類型模板參數和非類型模板參數,以前的那一種定義方式就是類型模板參數,即T是一個肯定的類型,在編譯時肯定下來
非類型模板參數的定義是:用一個常量做爲模板參數列表的參數,好比:it
template <class T,int N=10> class a { private: T arr[N]; };
在這段代碼裏建立了一個T類型的有10個元素的數組。 注意:浮點數、字符串和類對象不能做爲非類型模板參數,而且非類型模板參數在編譯時就要能肯定結果。
模板的特化及類型萃取:
模板特化:在原模板類型的基礎上,針對特殊類型進行特殊特化的操做。
模板特化分爲函數模板特化和類模板特化,函數模板特化咱們不經常使用,在須要時寫一個處理特殊狀況的函數便可,使用函數模板特化有些畫蛇添足,咱們經常使用的是類模板特化,類模板特化分爲去全特化和偏特化。
全特化即將模板參數列表都給出具體的類型,template後接空<>而後在類模板參數列表給出具體的類型便可。
偏特化即給出某個具體的類型,在建立對象時顯示實例化就會調用特化的類。編譯
類模板在聲明和定義時不要分開,最好將生命和定義同時放在.h頭文件中,不然可能會致使連接出錯。模板