🎯 C++ 學習筆記:函數模板(Function Template)
本文是面向 C++ 初學者的函數模板學習筆記,內容包括基本概念、定義與使用、實例化過程、注意事項等,附帶示例代碼,便于理解與復現。
📌 一、什么是函數模板?
函數模板是一種泛型編程方式,允許你編寫與類型無關的函數代碼。
作用:
寫一個函數模板,可以根據不同數據類型自動生成對應的函數版本。
🛠? 二、函數模板的語法
template <typename T>
T function_name(T arg1, T arg2) {// ... 操作 T 類型參數
}
template <typename T>
:定義模板參數 TT
是類型占位符,用于表示任意數據類型
?? 三、示例:加法函數模板
#include <iostream>
using namespace std;template <typename T>
T add(T a, T b) {return a + b;
}int main() {cout << add(1, 2) << endl; // 輸出 3,自動推導為 intcout << add(1.5, 2.3) << endl; // 輸出 3.8,自動推導為 doublecout << add<string>("Hello, ", "World!") << endl; // 字符串拼接return 0;
}
🧠 四、模板函數的實例化
模板函數在使用時才會生成具體代碼,這稱為“實例化”。
int result = add<int>(10, 20); // 指定類型為 int,生成 add<int>(int, int)
編譯器會根據傳入參數類型自動推導出 T
,也可以手動指定。
?? 五、注意事項
?? 問題 | 📌 說明 |
---|---|
模板不是函數聲明或函數定義嗎? | 模板定義本身就是聲明+定義,但不會生成實際函數,直到被實例化。 |
不支持所有運算符 | 模板中的操作符必須能作用于實際類型 |
嵌套模板需注意 | 早期 C++ 中 >> 會被解析錯誤,C++11 后修復 |
🧪 六、示例:最大值模板
template <typename T>
T max_val(T a, T b) {return (a > b) ? a : b;
}int main() {cout << max_val(3, 7) << endl; // 輸出 7cout << max_val(3.14, 2.18) << endl; // 輸出 3.14
}
📚 七、模板的聲明與定義分離
你可以只聲明模板函數,再在別處定義(通常不推薦放在 .cpp
中,因為模板需要被編譯器“看到”實現代碼來實例化)。
// 聲明(在頭文件中)
template <typename T>
T multiply(T a, T b);// 定義(通常也放在頭文件)
template <typename T>
T multiply(T a, T b) {return a * b;
}
🧩 八、函數模板與函數重載
模板函數可以和普通函數共存,編譯器會優先選擇普通函數,再考慮模板匹配。
int add(int a, int b) {return a + b;
}template <typename T>
T add(T a, T b) {return a + b;
}int main() {cout << add(1, 2) << endl; // 調用普通函數 add(int, int)
}
? 九、總結
項目 | 內容 |
---|---|
關鍵詞 | template<typename T> |
適用場景 | 類型不確定但功能一致的函數 |
實例化時機 | 使用時才實例化 |
編譯注意 | 模板定義建議放在頭文件中 |
易錯點 | 不能盲目使用操作符,需考慮具體類型支持 |
📌 十、推薦練習
- 寫一個
min_val
模板函數 - 寫一個支持任意類型求平方的
square<T>(T x)
模板函數 - 試試模板函數與普通函數共存的情況
📖 學習模板是理解 C++ 泛型編程的第一步,也是掌握 STL 的基礎。加油 💪!