1. 程式人生 > >《函式模板學習筆記》

《函式模板學習筆記》

  1. 函式模板 函式模板的目的:當函式的邏輯相同,但函式引數型別不同時,讓型別引數化。
#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. 函式模板遇上函式過載 呼叫函式模板(本質:型別引數化)會對入口引數嚴格的按照型別匹配,不會進行自動型別轉換。 普通函式的呼叫:可以進行隱式的型別轉換。 呼叫規則研究: (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;
}
  1. 函式模板原理 C語言編譯器gcc,C++語言編譯器g++。 編譯器並不是把函式模板處理成能處理任意類的函式,編譯器從函式模板通過具體型別產生不同的函式。編譯器會對函式模板進行兩次編譯: (1) 在宣告的地方對模板程式碼本身進行編譯 (2) 在呼叫的地方對引數替換後的程式碼進行編譯