//交換int數據 void SwapInt(int& a,int& b){ int temp = a; a = b; b = temp; } //交換char數據 void SwapChar(char& a,char& b){ char temp = a; a = b; b = temp; } //問題:若是我要交換double類型數據,那麼還須要些一個double類型數據交換的函數 //繁瑣,寫的函數越多,當交換邏輯發生變化的時候,全部的函數都須要修改,無形當中增長了代碼的維護難度 //若是能把類型做爲參數傳遞進來就行了,傳遞int就是Int類型交換,傳遞char就是char類型交換 //咱們有一種技術,能夠實現類型的參數化---函數模板 //class 和 typename都是同樣的,用哪一個均可以 template<class T> void MySwap(T& a,T& b){ T temp = a; a = b; b = temp; } void test01(){ int a = 10; int b = 20; cout << "a:" << a << " b:" << b << endl; //1. 這裏有個須要注意點,函數模板能夠自動推導參數的類型 MySwap(a,b); cout << "a:" << a << " b:" << b << endl; char c1 = 'a'; char c2 = 'b'; cout << "c1:" << c1 << " c2:" << c2 << endl; //2. 函數模板能夠自動類型推導,那麼也能夠顯式指定類型 MySwap<char>(c1, c2); cout << "c1:" << c1 << " c2:" << c2 << endl; }
用模板是爲了實現泛型,能夠減輕編程的工做量,加強函數的重用性。c++
下面寫個案例:使用函數模板實現對char和int類型數組進行排序。編程
//模板打印函數 template<class T> void PrintArray(T arr[],int len){ for (int i = 0; i < len;i++){ cout << arr[i] << " "; } cout << endl; } //模板排序函數 template<class T> void MySort(T arr[],int len){ for (int i = 0; i < len;i++){ for (int j = len - 1; j > i;j--){ if (arr[j] > arr[j - 1]){ T temp = arr[j - 1]; arr[j - 1] = arr[j]; arr[j] = temp; } } } } void test(){ //char數組 char tempChar[] = "aojtifysn"; int charLen = strlen(tempChar); //int數組 int tempInt[] = {7,4,2,9,8,1}; int intLen = sizeof(tempInt) / sizeof(int); //排序前 打印函數 PrintArray(tempChar, charLen); PrintArray(tempInt, intLen); //排序 MySort(tempChar, charLen); MySort(tempInt, intLen); //排序後打印 PrintArray(tempChar, charLen); PrintArray(tempInt, intLen); }
1.函數模板不容許自動類型轉化數組
2.普通函數可以自動進行類型轉化ide
//函數模板 template<class T> T MyPlus(T a, T b){ T ret = a + b; return ret; } //普通函數 int MyPlus(int a,char b){ int ret = a + b; return ret; } void test02(){ int a = 10; char b = 'a'; //調用函數模板,嚴格匹配類型 MyPlus(a, a); MyPlus(b, b); //調用普通函數 MyPlus(a, b); //調用普通函數 普通函數能夠隱式類型轉換 MyPlus(b, a); //結論: //函數模板不容許自動類型轉換,必須嚴格匹配類型 //普通函數能夠進行自動類型轉換 }
//函數模板 template<class T> T MyPlus(T a, T b){ T ret = a + b; return ret; } //普通函數 int MyPlus(int a, int b){ int ret = a + b; return ret; } void test03(){ int a = 10; int b = 20; char c = 'a'; char d = 'b'; //若是函數模板和普通函數都能匹配,c++編譯器優先考慮普通函數 cout << MyPlus(a, b) << endl; //若是我必需要調用函數模板,那麼怎麼辦? cout << MyPlus<>(a, b) << endl; //此時普通函數也能夠匹配,由於普通函數能夠自動類型轉換 //可是此時函數模板可以有更好的匹配 //若是函數模板能夠產生一個更好的匹配,那麼選擇模板 cout << MyPlus(c,d); } //函數模板重載 template<class T> T MyPlus(T a, T b, T c){ T ret = a + b + c; return ret; } void test04(){ int a = 10; int b = 20; int c = 30; cout << MyPlus(a, b, c) << endl; //若是函數模板和普通函數都能匹配,c++編譯器優先考慮普通函數 }