c++ 模板分為2類:
1. 函式模板
格式:template void swap(t& a, t& b){}
呼叫時:
int a,b;
swap(a,b);
double d1,d2;
swap(d1,d2);
但是下面寫法是錯誤的:
swap(int,int):不能在函式呼叫的引數中指定模板形參的型別,對函式模板的呼叫應使用實參推演來進行
2.類模板
格式:templateclass 類名{}
比如:cpp**
1. template
2. class a
3. ;
類模板物件的建立:比有乙個模板類a,則使用類模板建立物件的方法為am;在類a 後面跟上乙個<>尖括號
並在裡面填上相應的型別,這樣的話類a 中凡是用到模板形參的地方都會被int 所代替。當類模板有兩個模板形參
時建立物件的方法為am;型別之間用逗號隔開。
對於類模板,模板形參的型別必須在類名後的尖括號中明確指定。比如a<2> m;用這種方法把模板形參設定為int
是錯誤的,類模板形參不存在實參推演的問題。也就是說不能把整型值2 推演為int 型傳遞給模板形參。要把類模板
形參調置為int 型必須這樣指定am。
在類模板外部定義成員函式的方法為:template《模板形參列表》 函式反回型別類名《模板形參名》::函式名(引數列表),比如有兩個模板形參t1,t2的類a中含有乙個void h()函式,則定義該函式的語法為:template void a::h(){}。注意當在類外面定義類的成員時template後面的模板形參應與要定義的類的模
板形參一致。
模板的形參
有三種型別的模板形參:型別形參,非型別形參和模板形參。
1、型別形參
1.1 型別模板形參:型別形參由關見字class或typename後接說明符構成,如templatevoid h(t a){};其中t就是乙個型別形參,型別形參的名字由使用者自已確定。模板形參表示的是乙個未知的型別。模板型別形參可作為型別說
明符用在模板中的任何地方,與內建型別說明符或類型別說明符的使用方式完全相同,即可以用於指定反回型別,
變數宣告等。
1.2 不能為同乙個模板型別形參指定兩種不同的型別,比如templatevoid h(t a, t b){},語句呼叫h(2, 3.2)將出錯,因為該語句給同一模板形參t指定了兩種型別,第乙個實參2把模板形參t指定為int,而第二個實參3.2把模板形參指定為double,兩種型別的形參不一致,會出錯。
2、非型別形參
2.1 非型別模板形參:模板的非型別形參也就是內建型別形參,如templateclass b{};其中int a就是非型別
的模板形參。
2.2 非型別形參在模板定義的內部是常量值,也就是說非型別形參在模板的內部是常量。
2.3 非模板型別的形參只能是整型,指標和引用,像double,string, string **這樣的型別是不允許的。但是double &,double*,物件的引用或指標是正確的。
2.4 呼叫非型別模板形參的實參必須是乙個常量表示式,即他必須能在編譯時計算出結果。
2.5 注意: 任何區域性物件,區域性變數,區域性物件的位址,區域性變數的位址都不是乙個常量表示式,都不能用作非型別模
板形參的實參。全域性指標型別,全域性變數,全域性物件也不是乙個常量表示式,不能用作非型別模板形參的實參。
2.6 全域性變數的位址或引用,全域性物件的位址或引用const型別變數是常量表示式,可以用作非型別模板形參的實參。
類模板非型別形參示例
//模板的宣告或定義只能在全域性,命名空間或類範圍內進行。即不能在區域性範圍,函式內進行,比如不能在main函式中宣告或定義乙個模板。
cpp**
1. //類模板的定義
2. templateclass a; //定義帶有乙個類模板型別形參t的類a
3. templateclass b; //定義帶有兩個類模板型別形參t1,t2的類b
cpp**
1. //定義類模板的預設型別形參,預設型別形參不適合於函式模板。
2. templateclass d; //定義帶預設型別形參的類模板。這裡把t2預設設定為int型。
cpp**
1. //templateclass e{}; //錯誤,為t1設了預設型別形參則t1後面的所有形參都必須設定認默值。
cpp**
1. //以下為非型別形參的定義 www.2cto.com
C 模板詳解
模板分類 類模板假如現在需要實現乙個交換整數的函式,很簡單就能實現,但是如果沒有說交換型別,那麼可能需要寫各種型別的過載,函式過載雖然可以實現,但是這麼做很麻煩,函式的復用性很低,且 的可維護性比較低,乙個出錯可能讓所有過載都錯。void swap int left,int right void s...
C 模板詳解
模板是c 支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數 返回值取得任意型別。模板是一種對型別進行引數化的工具 通常有兩種形式 函式模板和類模板 函式模板針對僅引數型別不同的函式 類模板針對僅資料成員和成員函式型別不同的類。使用模板的...
c 模板詳解
模板是c 支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數 返回值取得任意型別。模板是一種對型別進行引數化的工具 通常有兩種形式 函式模板和類模板 使用模板的目的就是能夠讓程式設計師編寫與型別無關的 比如編寫了乙個交換兩個整型int 型...