1.定義模板
1.1函數(shù)模板
template<模板參數(shù)列表>
返回值 函數(shù)名(形參列表)
實(shí)例化函數(shù)模板
通過形參列表來推導(dǎo)出模板參數(shù)的實(shí)參蝶缀。
模板類型參數(shù)
A類型模板參數(shù)
template<typename T>
typename T 為模板類型參數(shù)
B非類型模板參數(shù)
template<類型 a>
類型有所限定,如果是非引用或指針是整型椒惨, 有引用或指針必須有靜態(tài)生存期。
編寫類型無關(guān)的代碼
為了達(dá)到泛型編程的目的潮罪,適用范圍廣康谆,有兩個(gè)原則
!模板中的函數(shù)參數(shù)是const的引用
! 函數(shù)題中的條件判斷僅使用<比較運(yùn)算
模板應(yīng)盡量減少對(duì)實(shí)參的要求
模板的編譯
模板是在編譯期間實(shí)例化错洁,第一步先檢查語法秉宿,第二步實(shí)例化
1.2 類模板
類模板的定義
template<typename T>
class 類名
{
...
};
實(shí)例化類模板
類模板必須通過顯示模板參數(shù)來實(shí)例化戒突,并且每一個(gè)實(shí)例直接互相不關(guān)聯(lián)屯碴。
類模板成員函數(shù)的實(shí)例化
定義前面要加上template<typename T>
在類代碼內(nèi)簡(jiǎn)化模板類名的使用
如果在類內(nèi)可以不使用要有模板的類名
template<typename T>
class A{
A();//也可以A<T>();
A& operator ++();
}膊存;
在類模板外使用類模板名
與上面相對(duì)應(yīng)导而,如果A()在模板外定義
template<typename T>
A<T>& A<T>::operator++(){}
其中有了A<T>::的類作用域聲明或在函數(shù)中可以上在類內(nèi)一樣不用在類后加上類型。
類模板和友元
一對(duì)一的友元
template <tynename> class BlobPtr;
template<typename T>
class{
friend class BlaobPtr<T>;
}
兩個(gè)類型參數(shù)相同
通用和特定的模板友好關(guān)系
template<typename T>class Pal;
class C{
friend class Pal<X>;//所有的Pal都是友元隔崎,并且不用前項(xiàng)聲明今艺。
}
令模板自己的類型參數(shù)成為友元
template<typename Type> class Bar{
friend Type;//用那個(gè)實(shí)例化,那個(gè)將成為他的友元 爵卒,內(nèi)置類型也可以虚缎。
};
類模板的static成員
每個(gè)實(shí)例有一個(gè)靜態(tài)成員,通過類名 或 對(duì)象訪問钓株。
默認(rèn)模板實(shí)參
和函數(shù)的默認(rèn)相似
控制實(shí)例化
extern template declaration;//聲明 在有定義的cpp文件生成模板實(shí)例
template declaration;//定義在該cpp生成模板实牡。
這種實(shí)例化模板聲明會(huì)實(shí)例(定義)所有的成員,所以必須保證所以類型都可以以應(yīng)用于成員函數(shù)轴合。 (普通的類模板實(shí)例是部分實(shí)例创坞,用那個(gè)成員實(shí)例化哪個(gè))
1.3模板的實(shí)參推斷
類型轉(zhuǎn)換與模板類型參數(shù)
支持轉(zhuǎn)換類型
!const轉(zhuǎn)換 非const的引用或指針可以向const轉(zhuǎn)換
受葛! 數(shù)組向指針轉(zhuǎn)換 (函數(shù)參數(shù)不是引用類型)
其他類型都不可以比如 double向int轉(zhuǎn)換
函數(shù)模板的顯示實(shí)參
類似與類的實(shí)例化 函數(shù)名<顯示模板參數(shù)類型>
這種支持一般的轉(zhuǎn)換
尾置返回類型與類型轉(zhuǎn)換
略
模板的特化
template<>
class stack<string>{
};
對(duì)于某種不可以轉(zhuǎn)換的類型可以將其特化為可以轉(zhuǎn)換的類型
還可以添加功能(成員)
模板的特例本質(zhì)是模板的實(shí)例化與函數(shù)的重載不同题涨。
模板的偏(部分)特化
類模板可以偎谁,函數(shù)模板不能,
template<typename T>
class stack<T&>{
};
泛型編程
關(guān)聯(lián)特性
是把一種類型提示為更大內(nèi)存的類型 纲堵,讓程序的運(yùn)行更加的同用巡雨。
迭代器
Iterators(迭代器)是算法和容器的橋梁。將迭代器作為算法的參數(shù)席函、通過迭代器來訪問容器而不是把容器直接作為算法的參數(shù)鸯隅。迭代器事故STL中的樞紐。
向挖。
容器
vector
deque
list
stack
queue
map和Multimup
set和multiset
使用查表即可