使用template
定義函數模板時,使用 template
前綴” />
函數模板的基本結構
一個最簡單的函數模板看起來像這樣:
前綴” />
template<typename T> T max(T a, T b) { return (a > b) ? a : b; }
- template
:這是模板聲明前綴,表示這是一個模板函數。 - T 是一個類型參數,在調用函數時由編譯器自動推導或顯式指定。
- 函數體中的邏輯和普通函數一樣,只是用 T 替代了具體類型。
你可以用這個函數比較 int、double、甚至自定義類型的值(只要支持 > 運算符)。
模板關鍵字 typename 的含義
在 template
前綴” />
template<class T> T max(T a, T b);
其實這兩種寫法在函數模板中是等價的,都可以使用。不過從語義上講,typename 更準確一些,因為它明確表示這是一個通用類型,而不僅僅是類類型。
使用函數模板的幾種方式
-
自動類型推導
在調用模板函數時,如果參數類型能被明確推導出來,可以直接省略類型:int a = 3, b = 5; int result = max(a, b); // 編譯器自動推導為 max<int>
-
顯式指定類型
如果你想強制使用某種類型,或者無法通過參數推導出類型,可以顯式指定:double result = max<double>(3.0, 5);
-
多個模板參數
函數模板也可以有多個類型參數,比如:template<typename T, typename U> void printPair(T a, U b) { std::cout << a << " and " << b << std::endl; }
注意事項與常見問題
-
類型必須兼容
如果傳入的類型不支持函數內部的操作(比如沒有重載 > 運算符),編譯會失敗。 -
模板不能跨文件分離聲明和定義
函數模板的定義(包括函數體)通常必須放在頭文件中,否則鏈接時可能找不到實現。 -
避免重復實例化
編譯器會根據不同的類型生成不同的函數版本,這可能導致代碼膨脹,尤其在大型項目中要注意控制模板使用的范圍。
基本上就這些。掌握 template