關鍵詞:泛型編程、函數模板
0. 問題:C++中有幾種交換變量的方法?
(1) 定義宏代碼塊:
優點:代碼復用,適合所有的類型
缺點:編譯器不知道宏的存在,缺少類型檢查
(2) 定義函數
優點:真正的函數調用,編譯器對類型進行檢查
缺點:根據類型重復定義函數,無法代碼復用
1. 泛型編程
- 概念:不考慮具體數據類型的編程方式
- 語法規則:
void Swap(T& a, T& b)
{
T t = a;
a = b;
b = t;
}
Swap
泛型寫法中T不是一個具體的數據類型,而是泛指任意的數據類型。
- 方法:
(1) 函數模板
(2) 類模板
2. 函數模板
- 概念:一種特殊的函數可用不同類型進行調用,看起來和普通函數很相似,區別在于類型可被參數化
- 語法規則:
template <typename T>
void Swap(T& a, T&b)
{
T t = a;
a = b;
b = t;
}
template
關鍵字用于聲明開始進行泛型編程
typename
關鍵字用于聲明泛型類型
- 使用方法:
(1) 自動類型推導調用
int a = 0;
int b = 1;
Swap(a, b);
(2) 具體類型顯示調用
double c = 2;
double d = 3;
Swap<float>(c, d);
編程說明:函數模板初探
#include <iostream>
#include <string>
using namespace std;
template < typename T > // 函數模板
void Swap(T& a, T& b)
{
T c = a;
a = b;
b = c;
}
int main()
{
int a = 0;
int b = 1;
Swap(a, b); // ==> Swap<int>(a, b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
double c = 2;
double d = 3;
Swap(c, d); // ==> swap<double>(a, b);
cout << "c = " << c << endl;
cout << "d = " << d << endl;
string l = "lll";
string i = "iii";
Swap<string>(l, i);
cout << "l = " << l << endl;
cout << "i = " << i << endl;
return 0;
}
輸出結果
a = 1
b = 0
c = 3
d = 2
l = iii
i = lll
3. 小結
- 函數模板是泛型編程在C++中的應用方式之一
- 函數模板能夠根據實參對參數類型進行推導
- 函數模板支持顯示的指定參數類型
- 函數模板是C++中重要的代碼復用方式