模板是C++支持參數化多態的工具,能夠編寫與類型無關的代碼。
通常有兩種形式:函數模板和類模板
(1)函數模板針對參數類型不同的函數;
(2)類模板針對數據成員和成員函數類型不同的類。
注意:模板的聲明或定義要在全局、命名空間或類範圍內,不能在局部範圍或者函數內進行。
一、函數模板
1、定義
函數模板是一個獨立於類型的函數,可作爲一種方式,產生函數的特定類型版本。
2、格式
- template<class/typename 形參名1,class/typename 形參名2,…> 返回類型 函數名(形參列表)
{
函數體;
}
- template<typename/class T>
返回類型 函數名(形參列表)
{
函數體;
}
注意:模板形參不能爲空。聲明後可以在該函數中使用模板定義的形參名來定義變量。
3、實例:
template<class T>void swap(T& a,T& b){}
函數的調用方式:swap(1,2);//在調用時會自動判斷數據類型
編譯器會判斷哪個模板實參(template argument)綁定到模板形參(template parameter),一旦編譯器確定了實際的模板實參,就稱它爲實例化(instantiate)了函數模板的一個實例。
二、類模板
1、意義
支持不同類型的對象。
在類和類成員的定義中,可以使用模板形參作爲類型或值的佔位符,在使用類的時候再提供那些類型或值。
2、格式
template<class/typename 形參名1,class/typename 形參名2,…>class 類名
{
類的聲明;
};
注意:模板形參不能爲空。聲明後可以在該類中使用模板定義的形參名來定義成員變量和成員函數。
在類模板外定義成員函數:
template<模板形參列表[class/typename 形參名1,class/typename 形參名2,…]>函數返回類型 類名<模板形參名>::函數名(函數形參列表)
{
函數體;
}
注意:template後面跟的模板形參應與定義的類的模板形參完全一致
2、實例
template <class T>class A
{
public:
T a;
T b;
T sl(T c,T &d);
};
template<class T1,class T2> void A<T1,T2>::fun(){}
3、類模板對象的創建
類名<形參名1的實例化類型,形參名2的實例化類型,…> 對象名;
例如:A <int> k;