C 中的函式模板

2021-10-19 13:59:13 字數 2449 閱讀 3207

模板的意義:對型別也可以進行引數化了

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...