57 C++ - 函數模板

1. 什麼是函數模板?

//交換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);
}

2. 函數模板和普通函數區別?

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);

	//結論:
	//函數模板不容許自動類型轉換,必須嚴格匹配類型
	//普通函數能夠進行自動類型轉換
}

3.函數模板和普通函數在一塊兒調用規則

  • c++編譯器優先考慮普通函數
  • 能夠經過空模板實參列表的語法限定編譯器只能經過模板匹配
  • 函數模板能夠像普通函數那樣能夠被重載
  • 若是函數模板能夠產生一個更好的匹配,那麼選擇模板
//函數模板
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++編譯器優先考慮普通函數
}
相關文章
相關標籤/搜索