《函式模板學習筆記》
阿新 • • 發佈:2018-12-20
- 函式模板 函式模板的目的:當函式的邏輯相同,但函式引數型別不同時,讓型別引數化。
#include <iostream> using namespace std; template <typename T1, typename T2>//通知編譯器開始泛型程式設計 void TPrint(T1 x, T2 str1) //兩個不同引數的情況 { cout << "TPrint x:" << x << endl; cout << "TPrint str1:" << str1 << endl; } template <typename T> void TSwap(T &a, T &b) //兩個相同引數的情況 { T c; c = a; a = b; b = c; cout << "模板函式TSwap" << endl; } int main() { int x = 10; int y = 20; char str1 = 'a'; char str2 = 'b'; TSwap<int>(x,y);//函式模板顯示呼叫 //TSwap(x, y);//函式模板隱式呼叫 cout << "X:" << x <<endl; cout << "Y:" << y << endl; TSwap<char>(str1, str2);//函式模板顯示呼叫 //TSwap(str1, str2);//函式模板隱式呼叫 cout << "str1:" << str1 << endl; cout << "str2:" << str2 << endl; TPrint<int,char>(x,str1);//函式模板顯示呼叫 //TPrint(x, str1);//函式模板隱式呼叫 system("pause"); return 0; }
- 函式模板遇上函式過載 呼叫函式模板(本質:型別引數化)會對入口引數嚴格的按照型別匹配,不會進行自動型別轉換。 普通函式的呼叫:可以進行隱式的型別轉換。 呼叫規則研究: (1) 函式模板可以像普通函式一樣被過載。 (2) C++編譯器優先考慮普通函式。 (3) 如果函式模板可以產生一個更好的匹配,那麼選擇模板。 (4) 當函式模板和普通函式都符合呼叫時,優先選擇普通函式
#include <iostream> using namespace std; int Max(int a, int b) { cout << "Max(int a, int b)" << endl; return a > b ? a : b; } template <typename T> T Max(T a, T b) { cout << "T Max(T a, T b))" << endl; return a > b ? a : b; } template <typename T> T Max(T a, T b, T c) { cout << "T Max(T a, T b, T c)" << endl; return Max(Max(a,b), c); } int main() { int a = 1; int b = 2; cout << Max(a, b) << endl;//當函式模板和普通函式都符合呼叫時,優先選擇普通函式 cout << Max<>(a, b) << endl;//若顯式使用函式模板,則使用<>型別列表 cout << Max(3.0,4.0) << endl;//如果函式模板產生更好的匹配使用函式模板 cout << Max(3.0, 4.0,5.0) << endl;//過載 cout << Max('a', b) << endl;//呼叫普通函式,可以隱式轉換 system("pause"); return 0; }
- 函式模板原理 C語言編譯器gcc,C++語言編譯器g++。 編譯器並不是把函式模板處理成能處理任意類的函式,編譯器從函式模板通過具體型別產生不同的函式。編譯器會對函式模板進行兩次編譯: (1) 在宣告的地方對模板程式碼本身進行編譯 (2) 在呼叫的地方對引數替換後的程式碼進行編譯