一、簡介
在C++中,資料的型別也可以通過引數來傳遞,在函式定義時可以不指明具體的資料型別,當發生函式呼叫時,編譯器可以根據傳入的實參自動推斷資料型別,這就是型別的引數化,
函式模板是一種特殊的函式,可以使用不同的型別進行呼叫,對于功能相同的函式,不需要重復撰寫代碼,并且函式模板與普通函式看起來很類似,區別就是型別可以被引數化,
二、語法
函式模板的語法:
template <typename 型別引數1 , typename 型別引數2 , ...> 回傳值型別 函式名(形參串列){
//在函式體中可以使用型別引數
}
型別引數可以有多個,它們之間以逗號,分隔,型別引數串列以< >包圍,形式引數串列以( )包圍,
typename關鍵字也可以使用class關鍵字替代,它們沒有任何區別,C++ 早期對模板的支持并不嚴謹,沒有引入新的關鍵字,而是用 class 來指明型別引數,但是 class 關鍵字本來已經用在類的定義中了,這樣做顯得不太友好,所以后來 C++ 又引入了一個新的關鍵字 typename,專門用來定義型別引數,不過至今仍然有很多代碼在使用 class 關鍵字,包括 C++ 標準庫、一些開源程式等,
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#if 0
//int型別資料交換
void MySwap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
//double型別
void MySwap(double& a, double& b){
double temp = a;
a = b;
b = temp;
}
#endif
//模板技術 型別引數化 撰寫代碼可以忽略型別
//為了讓編譯器區分是普通函式 模板函式
template<class T1,class T2> //template<typename T>告訴編譯器 ,下面寫模板函式
void MySwap(T& a, T& b){
T temp = a;
a = b;
b = temp;
}
void test01(){
int a = 30;
int b = 20;
//1 自動型別推導,編譯器根據你傳的值 進行型別自動推導
cout << "a:" << a << " b:" << b << endl;
MySwap(a, b);
cout << "a:" << a << " b:" << b << endl;
double da = 12.3;
double db = 21.1;
cout << "da:" << da << " db:" << db << endl;
MySwap(da, db);
cout << "da:" << da << " db:" << db << endl;
//2. 顯式的指定型別
MySwap<int>(a, b);
}
int main(void){
test01();
return 0;
}
三、函式模板跟普通函式
函式模板跟普通函式一樣,也可以被多載
- C++編譯器優先考慮普通函式
- 如果函式模板可以產生一個更好的匹配,那么就選擇函式模板
- 也可以通過空模板實參串列<>限定編譯器只匹配函式模板
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
template<class T>
int MyAdd(T a,T b){
return a + b;
}
//普通函式可以進行自動型別轉換
//函式模板必須嚴格型別匹配
int MyAdd(int a,int c){
return a + c;
}
void test01(){
int a = 10;
int b = 20;
char c1 = 'a';
char c2 = 'b';
MyAdd<>(a,b);//限定只使用函式模板
MyAdd(a,c1);//這個呼叫,函式模板有更好的匹配,于是呼叫函式模板
MyAdd(a, b);//普通函式int MyAdd(int a,int c)已經能完美匹配,于是呼叫普通函式
MyAdd(c1,b);//這個呼叫,函式模板有更好的匹配,于是呼叫函式模板
}
//函式模板被多載
template<class T>
void Print(T a){
}
template<class T>
void Print(T a , T b){
}
int main(void)
{
test01();
return 0;
}
四、函式模板機制:
- 編譯器并不是把函式模板處理成能夠處理任何型別的函式
- 函式模板通過具體型別產生不同的函式
- 編譯器會對函式模板進行再次編譯,在宣告的地方對模板代碼本身進行編譯,在呼叫的地方對引數替換后的代碼進行編譯,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/245017.html
標籤:C++
上一篇:三目運算子(C++)
