STL:函式模板
阿新 • • 發佈:2022-03-25
1.函式模板
使用模板 型別引數化 編寫程式碼可以忽略型別
2.函式模板和類模板
函式模板針對僅引數型別不同的函式
類模板針對僅資料成員和成員函式型別不同的類
3.函式模板通式
template 只對其後的第一個函式有效
template <class 形參名,class 形參名,......> 返回型別 函式名(引數列表) { 函式體 }
4.呼叫函式模板的兩種方式
- 自動型別推導
- 顯示的指定型別
template<class T> // template<typename T> void mySwap(T &a, T &b) { T temp= a; a = b; b = temp; } //使用函式模板 void test01(){ //1. 自動型別推導 編譯器根據你傳進去的值進行型別自動推導 int a = 10; int b = 20; cout << "a:" << a << " b:" << b << endl; mySwap(a, b); cout << "a:" << a << " b:" << b << endl; doubleda = 1.13; double db = 1.14; cout << "da:" << da << " db:" << db << endl; mySwap(da, db); cout << "da:" << da << " db:" << db << endl; //2. 顯示的指定型別 a = 10; b = 20; cout << "a:" << a << " b:" << b << endl; mySwap<int>(a, b); mySwap<>(a, b); cout << "a:" << a << " b:" << b << endl;
5.函式模板和普通函式的區別
普通函式可以進行自動型別轉換 但是函式模板必須嚴格型別匹配
比如一個引數為int的普通函式 你可以傳short和char作為引數 但是函式模板不行
6.函式模板和普通函式在一起的呼叫規則
- 函式模板可以像普通函式那樣被過載
//1.模板過載 template<class T> void myPrint(T a) { cout << a << endl; } template<class T1, class T2> void myPrint(T1 a, T2 b) { cout << a << " " << b << endl; }
- C++編譯器優先考慮普通函式
- 如果函式模板可以產生一個更好的匹配,那麼選擇模板
- 可以通過空模板實參列表的語法限定編譯器只能通過模板匹配,例如 mySwap<>(a, b);