模板的意義:對型別也可以進行引數化了
template//定義乙個模板引數列表,typename也可以用class替換
bool compare(t a,t b)
//特例化:
template<>
bool compare(const char*a,const char*b)
bool compare(const char*a,const char*b)
int main()*/
compare(1,2);//compare模板名加引數列表合起來才是函式名
compare(2,3);//#2只用模板名也可以正常呼叫
compare(2,3.0);//實參推演不成功報錯,解決方法1:指定型別,解決方法2:compare函式模板的形參列表用不同的模板引數(t a,e b)
compare("aaa","bbb");//呼叫普通函式
/*如果沒有寫特例化和普通函式便會例項化出:
compare(const char* a,const char* b)*/
compare("aaa","bbb");//呼叫特例化模板函式
return 0;
}
#1在函式呼叫點,編譯器根據使用者指定的型別,從原模板例項化出乙份函式**
例項化出的函式稱為模板函式,是真正參與**編譯的函式。函式模板本身無法編譯
#2只用模板名也可以正常呼叫,是模板的實參推演,根據傳入的實參型別,來推導出模板型別引數的具體型別。同一種型別,模板只會例項化一次
#3對於某些型別,以來編譯器預設例項化的模板**,**處理邏輯會有錯誤,此時需要給模板提供特例化(特殊的例項化),例項化時的模板**不由編譯器提供,而是由使用者提供
#4引數列表相同的模板函式、特例化函式、普通函式(構成過載的說法不嚴謹,因為函式名並不相同,模板函式函式名還包括尖括號),呼叫優先順序:普通函式》特例化》模板函式,不寫尖括號優先呼叫普通函式,再是特例化,再是實參推演,因為編譯器優先將compare處理成函式名,找不到對應函式才找函式模板;寫了尖括號先呼叫特例化,再是普通模板函式
函式不會去呼叫引數列表不同的函式,比如引數是int型別的會去自動呼叫模板函式並實參推演,而不是呼叫形參是const char*型別的普通函式
分檔案定義宣告的情況
模板函式.cpp
#include using namespace std;
templatebool compare(t a, t b)
template<>
bool compare(const char* a, const char* b)
bool compare(const char* a, const char* b)
test.cpp
#include using namespace std;
templatebool compare(t a, t b);
int main()
//結果是都呼叫了特例化compare
#include using namespace std;
templatebool compare(t a, t b);
bool compare(const char* a, const char* b);
int main()
總結:模板**是不能在乙個檔案中定義,在另外乙個檔案中使用。模板**呼叫之前一定要看到它這個函式名定義的地方,這樣模板才能正常例項化,產生能被編譯器編譯的**。
所以模板**一般放在.**件中,然後在原始檔中#include包含
如果一定要分檔案,需要在模板函式.cpp中:
#include using namespace std;
templatebool compare(t a, t b)
//和特例化有區別,此操作為告訴編譯器直接執行指定型別的例項化,不再在呼叫點例項化
template bool(int,int);
template bool(double,double);
模板的非型別引數
必須是整數型別(int,char,short,long)(整數或位址、引用),都是常量,只能使用,不能修改
#includeusing namespace std;
templatevoid sort(t* arr)
} }}int main() ;
const int size = sizeof(arr) / sizeof(arr[0]);
//使用方式:
sort(arr);
for (int val : arr)
cout << endl;
return 0;
}
C 中的函式模板
我們在定義函式時,可以通過定義函式模板,來簡化一些功能相同而資料型別不同的函式的定義和呼叫過程。c 中的函式模板 對於類的宣告來說,也有同樣的問題。有時,有兩個或多個類,其功能是相同的,僅僅是資料型別不同,如下面語句宣告了乙個類 class compare int int max int min f...
C 中的模板(函式模板,類模板)
1.模板是生成類或函式的框架,模板使用形參,當實際資料型別賦值給形參的時候,才由編譯器生成類或函式 2.函式模板的宣告由關鍵字template和包含乙個或多個資料型別形參的引數列表構成,形參資料型別 t 前面可以是class也可以是typename,型別形參t要用尖括號 括起來 template 或...
C 中的函式模板詳解
了解或熟悉c 的都,都對函式過載有一定的了解。c 中的函式過載就是指申明幾個功能類似的函式,但這些函式的引數型別或順序必須不同,即同乙個函式不同的運算功能。例如,比較a,b的大小,我們可以定義乙個max函式,對不同的型別有如下的版本 char max char a,char b int max in...