1. 程式人生 > >模板(C++)(未完待續)

模板(C++)(未完待續)

為了提高程式的可重用性,C++中引入了模板這一概念。

舉例來說,為了實現一個交換函式,因為資料型別的關係,可能你需要實現好幾種只是引數型別有差異的相同的函式,這大大降低了我們的工作效率;但通過使用模板我們可以實現一個萬能的交換函式。

函式模板形式如下:

template <class 型別引數1, class型別引數2, ...>
返回值型別  模板名(形參表)
{
    函式體
}

其中的 class 關鍵字也可以用 typename 關鍵字替換,例如:

template <typename 型別引數1, typename 型別引數2, ...>

模板過載

在有多個函式和函式模板名字相同的情況下,一條函式呼叫語句到底應該被匹配成對哪個函式或哪個模板的呼叫呢? C++編譯器遵循以下先後順序:

  1. 先找引數完全匹配的普通函式(非由模板例項化得到的函式)。
  2. 再找引數完全匹配的模板函式。
  3. 再找實參經過自動型別轉換後能夠匹配的普通函式。
  4. 如果上面的都找不到,則報錯。

程式碼說明

#include<iostream>
using namespace std;
template<class T>
void Swap(T& a, T& b)
{
	T temp = a;
	a = b;
	b = temp;
}
//編譯器由模板自動生成函式的過程叫做模板的例項化,生成的函式叫做模板函式
//通過 模板名<型別名1,型別名2,...>(顯式定義)這種方式告訴編譯器應該如何例項化
//模板函式template<class T>
template<class T>
T sum(int a)
{
	return a + 1;
}
//模板函式可以不只有一個引數
template<class T1,class T2>
T1 Print(T1 arg1, T2 arg2)
{
	cout << arg1 << " " << arg2 << endl;
	return arg1;
}
//模板過載
void test(int num1,int num2)
{
	cout << "noraml:"<< endl;
}

template<class T>
void test(T num1,T num2)
{
	cout << "templete:" << endl;
}

template<class T1,class T2>
void test(T1 num1,T2 num2)
{
	cout << "adjust templete:"  << endl;
}


int main()
{
	int a = 1, b = 2;
	Swap(a, b);
	cout << a << " " << b << endl;
	double c = 1.2, d = 1.0;
	Swap(c, d);
	cout << c << " " << d << endl;
	char e = 'E', f = 'F';
	Swap(e, f);
	cout << e << " " << f << endl;
	

	cout << sum<double>(4) / 2 << endl;

	int arg1 = 2;
	char*arg2 = "HELLO";

	test(1, 2);
	test(1.2, 2);

	system("pause");
	return 0;
}