1, 模板觀念與函數模板算法
簡單模板:
template< typename T > T Function( T a, T b) {… }函數
類模板:
template struct Object{……….};
函數模板
template< class T> inline T Function( T a, T b){……}
不可使用不一樣型別的參數來調用函數模板優化
可使用class代替typename. 但不能使用struct代替typename指針
使用具體類型代替模板參數T叫實例化, 從而產生一個模板實例. 編譯器
模板編譯過程:
實際編譯兩次
1,沒有實例化前,檢查模板代碼自己檢查是否有語法錯誤
2,實例化期間,檢查模板代碼的調用是否合法it
模板編譯
1,類型必須嚴格符合,不可自動型別轉換.
2,若是真的要轉換,那麼須要使用static_cast< …>進行強制轉換.io
函數模板重載
1, 模板函數能夠像普通函數同樣被重載
2, 非模板函數能夠和同名模板函數共存
3, 編譯器經過函數模板參數推導來決定使用哪一個重載
其餘因素相同的狀況下,重載裁決過程調用非模板函數.
(不然編譯器還須要本身在實例化一套代碼)編譯
Max<>(7,32) 調用Max容許空模板參數
Max(2,3) 顯式指定模板實參類型ast
2, C++類模板 模板
template < typename T, size_t n = 1024> class Stack{……..};
a,關鍵字 typename 和class 均可使用
b,在模板內, T能夠像int,char同樣 定義成員變量和成員函數
c,除了Copy constructor以外, 若是在類模板內須要使用到這個類自己,如定義operator=,那麼應該使用其完整定義(Stack)
Stack& operator=( Stack < T,n> const & );
類模板的使用:
1,Stack s;
2,Stack< int,100> s;
1,Stack< Stack > s; 定義一個Stack的Stack , 此處必須有一個空格, 不然編譯器會覺得是>>操做符
3, 類模板特化
template<>
class Stack{……};
可能能夠作些特別的優化或者提供不一樣的實現
避免在實例化某些類時,引發一些可能產生的詭異行爲
4, 類模板偏特化
主模板:
template< typename T1, typename T2> class MyClass{…};
偏特化:
2
template< typename T> class MyClass< T,T>{…};
3
template< typename T> class MyClass< T,int>{…};
4
template< typename T1, typename T2> class MyClass< T1*,T2*>{…};
若是有不止一個偏特化同程度的能匹配某個調用,那麼該調用具備二義性,ERROR.
如 :
MyClass< int, int> obj; 知足 MyClass< T,T> 和 MyClass< T,int>
MyClass< int*, int*> obj; 知足 MyClass< T1*,T2* > 和 MyClass< T,T>
5, 默認模板實參
template< typename T, typename Tcons = std::vetor< T> > class Stack{…};
6, 操做符重載
除了 operator= ,其餘操做符均可以被重載.
7, 特性(Traits) - 重點
8, 迭代器
用於分離算法和容器 智能指針