泛型程式設計是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>(); //正确
}