1.函式模板的宣告和模板函式的生成
1.1函式模板的宣告
函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。
函式模板的宣告形式為:
template
《返回型別》《函式名》(參數列)
其中,template是定義模板函式的關鍵字;template後面的尖括號不能省略;typename(或class)是宣告資料型別引數識別符號的關鍵字,用以說明它後面的識別符號是資料型別識別符號。這樣,在以後定義的這個函式中,凡希望根據實參資料型別來確定資料型別的變數,都可以用資料型別引數識別符號來說明,從而使這個變數可以適應不同的資料型別。例如:
template
t fuc(t x, int y)
如果主調函式中有以下語句:
double d;
int a;
fuc(d,a);
則系統將用實參d的資料型別double去代替函式模板中的t生成函式:
double fuc(double x,int y)
函式模板只是宣告了乙個函式的描述即模板,不是乙個可以直接執行的函式,只有根據實際情況用實參的資料型別代替型別引數識別符號之後,才能產生真正的函式。
關鍵字typename也可以使用關鍵字class,這時資料型別引數識別符號就可以使用所有的c++資料型別。
1.2.模板函式的生成
函式模板的資料型別引數識別符號實際上是乙個型別形參,在使用函式模板時,要將這個形參例項化為確定的資料型別。將型別形參例項化的引數稱為模板實參,用模板實參例項化的函式稱為模板函式。模板函式的生成就是將函式模板的型別形參例項化的過程。例如:
使用中應注意的幾個問題:
⑴ 函式模板允許使用多個型別引數,但在template定義部分的每個形參前必須有關鍵字typename或class,即:
template
《返回型別》《函式名》(參數列)
⑵ 在template語句與函式模板定義語句《返回型別》之間不允許有別的語句。如下面的宣告是錯誤的:
template
int i;
t min(t x,t y)
⑶ 模板函式類似於過載函式,但兩者有很大區別:函式過載時,每個函式體內可以執行不同的動作,但同乙個函式模板例項化後的模板函式都必須執行相同的動作。
2 函式模板的異常處理
函式模板中的模板形參可例項化為各種型別,但當例項化模板形參的各模板實參之間不完全一致時,就可能發生錯誤,如:
template
void min(t &x, t &y)
例子中的後兩個呼叫是錯誤的,出現錯誤的原因是,在呼叫時,編譯器按最先遇到的實參的型別隱含地生成乙個模板函式,並用它對所有模板函式進行一致性檢查,例如對語句
min(i, j);
先遇到的實參i是整型的,編譯器就將模板形參解釋為整型,此後出現的模板實參j不能解釋為整型而產生錯誤,此時沒有隱含的型別轉換功能。解決此種異常的方法有兩種:
⑴採用強制型別轉換,如將語句min(i, j);改寫為min(i,int( j));
⑵用非模板函式過載函式模板
方法有兩種:
① 借用函式模板的函式體
此時只宣告非模板函式的原型,它的函式體借用函式模板的函式體。如改寫上面的例子如下:
template
void min(t &x, t &y)
執行該程式就不會出錯了,因為過載函式支援資料間的隱式型別轉換。
② 重新定義函式體
就像一般的過載函式一樣,重新定義乙個完整的非模板函式,它所帶的引數可以隨意。c++中,函式模板與同名的非模板函式過載時,應遵循下列呼叫原則:
• 尋找乙個引數完全匹配的函式,若找到就呼叫它。若引數完全匹配的函式多於乙個,則這個呼叫是乙個錯誤的呼叫。
• 尋找乙個函式模板,若找到就將其實例化生成乙個匹配的模板函式並呼叫它。
• 若上面兩條都失敗,則使用函式過載的方法,通過型別轉換產生引數匹配,若找到就呼叫它。
•若上面三條都失敗,還沒有找都匹配的函式,則這個呼叫是乙個錯誤的呼叫。
函式模板的宣告和模板函式的生成
函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字 t...
函式模板和模板函式
1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...
函式模板和模板函式
1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...