|
2 模板包括:函數(shù)模板和類模板
模板參數(shù)列表的寫法:template <typename T1,typename T2,...>,其中typename代表任意類型和class可以等價替換
函數(shù)模板和類模板的寫法:就是在模板的下面寫一個使用T1 T2的函數(shù)或者類
函數(shù)模板的特點:可以和其他函數(shù)模板和普通函數(shù)形成重載,調(diào)用的時候普通函數(shù)的優(yōu)先級大于函數(shù)模板
函數(shù)/類模板的實例化:
包含:隱式和顯式實例化
顯式實例化:
含義:就是顯式的寫出指定類型的函數(shù)/類模板聲明
代碼:template 類型 名字<>(),<>內(nèi)寫出指定類型,()中如果有typename類型的變量,直接顯式的寫出來類型,沒有就不寫
注意:如果某種類型的顯式實例化沒有寫,那么調(diào)用這種類型的函數(shù)/模板類就會出錯
隱式實例化:
含義:不顯示的寫出來指定類型的模板聲明,在調(diào)用的時候?qū)懼付ǖ念愋?
函數(shù)模板和類模板在模塊化結(jié)構(gòu)中:不能分為頭文件和實現(xiàn)文件,但是要避免頭文件臃腫可以:在頭文件的聲明后緊挨著#include "實現(xiàn)文件名字"
類模板的實例化:類名<typename T1,typename T2,...> 對象;
類模板的綜合使用:
已知定義了一個類模板A,里面有各種函數(shù),如果在類外進行具體實現(xiàn)?
tmplate<參數(shù)類型 參數(shù)名>
函數(shù)類型 類名<參數(shù)名,參數(shù)名>::函數(shù)名(參數(shù)類型 參數(shù)名){
}
類模板中可以定義函數(shù)模板或類模板類型的成員模板,成員模板不能是虛的
模板的特化: 包含:全特化和偏特化(也叫部分特化)
含義: 全特化:就是再寫一個同名的模板且給模板的通常參數(shù)T指定特定類型 部分特化:給模板參數(shù)指定特殊情況的實現(xiàn)
怎么寫?:
1模板參數(shù)列表寫成template <>
2類或函數(shù)名后面加<指定類型>
模板參數(shù):
模板的參數(shù)類型: 可以是類型參數(shù)T,可以是指定整形參數(shù),也可以有默認值
模板可變參數(shù):
含義:可以讓模板的參數(shù)類型的個數(shù)和參數(shù)的個數(shù)可變
寫法:
打包和解包:
打包:是在函數(shù)模板參數(shù)列表中定義參數(shù)包的過程
解包:是在函數(shù)調(diào)用中使用 ... 語法將參數(shù)包展開放入函數(shù)調(diào)用之中的過程
解包關(guān)鍵代碼:args...
解包通常用于:遞歸調(diào)用(args...) 的時候
解包遞歸調(diào)用代碼:
template <typename T, typename ...Args> // 模板參數(shù)列表
函數(shù)為:
void print(T t1, Args ...args) { // 函數(shù)參數(shù)包
cout << t1 << " "; // 打印第一個參數(shù)
print(args...); // 遞歸調(diào)用,打印余下的參數(shù)
}
調(diào)用print(1,"yunfan");的時候會輸出1 yunfan 和一個print()的輸出,所以一定要在函數(shù)模板前寫一個無參print
模板的位置:通常在全局,或者在類中
|
|