引言
在 C++ 世界里,模板(
Template
)就像一把萬能鑰匙。它允許你編寫通用的代碼,讓編譯器在需要的時候為具體類型生成對應的函數或類。換句話說,模板是 C++ 泛型編程(Generic Programming) 的基石。
- 如果說面向對象編程解決的是**“對象的多態**”,那么模板解決的就是“代碼的多態”。
- 本篇文章我們將通過
函數模板
和類模板
來學習模板的基礎知識。
一、概念
模板即字面意思,可以理解為制作雪糕的這個模板,在模板中填充不同口味的原料(類型),就會得到多個不同口味,相同形狀(即具體類型的代碼)的雪糕

二、函數模板
定義格式:
template<typename T1, typename T2,…,typename Tn>
返回值類型 函數名(參數列表){}
template<……>要寫在定義函數的前面一行
- 實現一個加法函數
int add(int a,int b)
,這個函數只能處理int
類型的參數 - 如果要對
double
、float
進行加法運算, - 需要再實現一個相同結構不同類型
double add(double a,double b)
的函數
這樣的代碼太過冗余,寫一個加法函數的模板就可以解決;傳入不同類型,運算不同類型對象;
1. 隱式實例化
和調用普通函數一樣,調用模板函數,模板函數根據傳入的參數類型推導模板類型
(??注意:當模板參數只有一個只能傳入同一種類型的參數,否則報錯)
代碼示例:
// 函數模板
template <class T>
T add(const T& a, const T& b)
{return a + b;
}
int main()
{//隱式實例化int a = 1, b = 2;cout << add(a, b) << endl;double c = 10.0, d = 20.0;cout << add(c, d) << endl;return 0;
}
2.顯示實例化
- 調用模板函數時,在函數名后面加上
<類型>
,例如:add<int> (a,b);
<>
內的參數個數根據template <>
內的參數而定
代碼示例:
// 函數模板
template <class T>
T add(const T& a, const T& b)
{return a + b;
}int main()
{//顯示實例化int a = 1, b = 2;cout << add<int>(a, b) << endl;double c = 10.0, d = 20.0;cout << add<double>(c, d) << endl;//類型不匹配時,編譯器自動進行類型轉換,轉換失敗就報錯cout<<add<int>(a,c)<<endl;return 0;
}
3. 普通函數和模板函數的優先級
- 一個普通函數與模板函數實例化后的函數類型完全相同時編譯器優先調用普通函數
- 如果顯示實例化(
add <int> (a,b)
),則會調用模板函數
using namespace std;
// 函數模板
template <class T>
T add(const T& a, const T& b)
{return a + b;
}
int add(int a,int b)
{return a + b;
}
int main()
{int a = 1, b = 2;//情況一:調用int add(int a,int b)普通函數cout << add(a, b) << endl;//情況二:調用T add(const T& a, const T& b)模板函數cout << add<int>(a, b) << endl;double c = 10.0, d = 20.0;//情況三:調用T add(const T& a, const T& b)模板函數cout << add(c, d) << endl;return 0;
}
三、類模板
定義格式
template<class T1, class T2, …, class Tn>
class 類模板名
{
// 類內成員定義
};
實例化
- 使用類模板進行實例化時,采用
類名+<類型>
的形式,且后面必須加上<>
;- 實例化的對象類型由
類名+<類型>
組成,例如:A<int> a1;
中的A<int>
是對象a1的類型,A
只是類名
代碼示例:
// 類模板
template <class T>
class A
{
public:T add(const T& a, const T& b){return a + b;}
private:T a;T b;};int main()
{A<int> a1;A<double> a2;cout<<a1.add(1, 1)<<endl;cout<<a2.add(1.0, 1.0)<<endl;return 0;
}
四、總結
函數模板解決的是“寫一次函數,適配多種類型”,而類模板則把這種靈活性帶進了類的世界。二者加起來,就構成了 C++ 泛型編程的基本骨架。學會它們之后,你就能體會到——代碼不再是寫死的,而是可以像拼積木一樣復用與擴展
寫到這里,模板的基礎操作就講完了;如果本文對你有幫助,麻煩你 👍點贊 ?收藏 ??關注 吧~