天天看點

C++泛型程式設計之函數模闆

泛型程式設計是C++的另一種程式設計思想,主要用到技術是模闆。

C++提供兩種模闆機制:函數模闆和類模闆

一、函數模闆

文法:

template<typename T>
函數聲明或定義
           

解釋:

template --- 聲明建立模闆

typename --- 表面其後面的符号是一種資料類型,可以用class代替

T --- 通用的資料類型,名稱可以替換,通常為大寫字母

#include "iostream"
#include <string>

using namespace std;

//模闆函數

//1、交換兩個整型
void SwapInt(int &a, int &b) 
{
	int temp = a;
	a = b;
	b = temp;
}
//2、交換兩個浮點型
void SwapDouble(double &a,double &b) 
{
	double temp = a;
	a = b;
	b = temp;
}
//3、交換兩個Char類型
void SwapChar(char &a, char &b)
{
	char temp = a;
	a = b;
	b = temp;
}

//未使用模闆函數之前的測試
void test01() {
	int a = 10;
	int b = 20;
	cout << "整型交換之前:a=" << a << endl;
	cout << "整型交換之前:b=" << b << endl;
	SwapInt(a, b);
	cout << "整型交換之後:a=" << a << endl;
	cout << "整型交換之後:b=" << b << endl;

	double fa = 100.001;
	double fb = 200.001;
	cout << "浮點型交換之前:fa=" << fa << endl;
	cout << "浮點型交換之前:fb=" << fb << endl;
	SwapDouble(fa, fb);
	cout << "浮點型交換之後:fa=" << fa << endl;
	cout << "浮點型交換之後:fb=" << fb << endl;
}

//模闆函數
/*
	文法:template<typename T>
	template    關鍵字 ———聲明要建立模闆函數
	typename	----- 表面其後面的符号是一種資料類型,可以用class代替
	T		    --- 通用的資料類型,名稱可以替換,通常為大寫字母

*/
template <class T>
void Swap(T &a, T &b)
{
	T temp = a;
	a = b;
	b = temp;
}

//使用模闆函數之後的測試
void test02() {

	cout << "************************開始使用模闆函數************************" << endl;
	int a = 10;
	int b = 20;
	cout << "整型交換之前:a=" << a << endl;
	cout << "整型交換之前:b=" << b << endl;
	//Swap(a, b);			//自動推導類型
	Swap<int>(a, b);		//顯示指定類型
	cout << "整型交換之後:a=" << a << endl;
	cout << "整型交換之後:b=" << b << endl;

	double fa = 100.001;
	double fb = 200.001;
	cout << "浮點型交換之前:fa=" << fa << endl;
	cout << "浮點型交換之前:fb=" << fb << endl;
	//Swap(fa, fb);			//自動推導類型
	Swap<double>(fa, fb);	//顯示指定類型
	cout << "浮點型交換之後:fa=" << fa << endl;
	cout << "浮點型交換之後:fb=" << fb << endl;

	char ca = 'A';
	char cb ='B';
	cout << "Char型交換之前:ca=" << ca << endl;
	cout << "Char型交換之前:cb=" << cb << endl;
	//Swap(ca, cb);			//自動推導類型
	Swap<char>(ca, cb);		//顯示指定類型
	cout << "Char型交換之後:ca=" << ca << endl;
	cout << "Char型交換之後:cb=" << cb << endl;
}


int main() {

	test01();
	test02();
	system("pause");
	return 0;
}
           

總結:

  • 函數模闆利用關鍵字 template
  • 使用函數模闆有兩種方式:自動類型推導、顯示指定類型
  • 模闆的目的是為了提高複用性,将類型參數化

模闆函數使用注意事項:

  • 自動類型推導,必須推導出一緻的資料類型T,才可以使用
  • 模闆必須要确定出T的資料類型,才可以使用
template<class T>
void func1(T a, T b)
{

}

template<class T1>
void func2()
{

}

//測試代碼
void funcTest()
{
	int a = 10;
	char b = 'B';
	//1、自動推導類型,必須推導出的資料類型T,才可以使用
	func1(a, b);    //報錯
	//2、模闆函數必須确定出T的資料類型,才可以使用
	func2();        //報錯
    func2<int>();   //正确
}
           

繼續閱讀