一些基本的模板特性:
非類引數模板
模板所宣告的引數可以不是類引數,可以宣告的非類引數包括整數(double,float不可以),enum,物件引用或指標。
通過模板巢狀實現類或非類引數載類方法引數上的過載(呼叫時實現,不在定義時實現)
友元函式模板:
直接舉例:
template
friend ostream& operator<< (ostream& os, const t& t){};
內聯模板函式:
模板定義必須在標頭檔案中,所以所定義的函式並不直接是內聯的,需要確定宣告該函式是內聯的。
inline void func(){}; //在模板類定義中
inline void a:: func{}; //在模板類定義外
高階模板特性:
模板巢狀
當在某個模板類的引數呼叫時,無論是類引數還是非類引數,需要另乙個模板引數,使用模板巢狀。
值得注意的時,模板巢狀不能handle當引數模板的引數和原模板的引數為同乙個類的情況,因此,必須要保留無模板巢狀的原始情況完成模板方法函式的過載。
另外,模板巢狀的優先順序是:
對於未使用引數模板,即引數全部使用原模板引數的方法,單獨定義,單獨呼叫。
一旦引數中使用了巢狀模板,則一定觸發某個巢狀模板方法,觸發的順序是,
觸發僅改變所有模板化引數的方法過載,如果沒有,則逐級觸發包括了更多未改變引數的巢狀模板。
測試**如下:
複製**
template class vec
int getscore() const
vec(t t):a(t),sc(score){};
//引數中未使用模版巢狀的拷貝構造,必須有
vec(const vec& vv):a(vv.a),sc(vv.sc)
template void showk(k* name)
void showk(char* name)
值得注意的是,當t為指標或者引用時,在找不到匹配的具體類的特化實現時,編譯器會取找有沒有指標特化或者引用特化,這些都優先於未特化模版。
且在指標特化和引用特化時,用例項化,但模版引數其實是a,也就是說例項化實際上是將a賦予t,然後使用指標特化模版。
模版繼承:
模版類可以實現繼承和多型,一般的,子類繼承父類的同引數例項類,如果要繼承任意類引數的例項類,只需要在模版中多宣告乙個父類類引數即可。
模版引數模版
模版巢狀用來模版化類模版的方法引數,特化用來過載模版的某乙個特例型別的實現或者過載乙個類集合;
常用於宣告乙個模版,他的引數是乙個模版類例項
基本語法如下,當使用了模版引數模版後,模版的模版引數在模版的定義內例項化,不需要外部實現。
用來例項化模版引數的類可以是任意確定類或者模版宣告的其他類引數。
模版引數模版的意義在於,在模版定義時即確定了其引數模版的引數,不需要在呼叫時由被呼叫者確定,應區別下面三種模版的宣告:
//通過模版引數模版,使得模版的引數模版可以使用任意類,但該類在原模版的定義中例項化確定。
template class container>
class temptemp;
//呼叫: temptemp//模版引數模版使用確定類,該類需要使用者自己宣告,但只能宣告確定類,一旦宣告其他類,編譯器會報錯
template >
class a;
//呼叫: temptemp>
//呼叫: temptemp>是編譯錯誤的
template >
class a;
//呼叫: temptemp>是編譯錯誤的
//呼叫: temptemp>
//上述兩個可實現模版過載
泛型程式設計 之 模板認知
說起來入行也兩年多了,今天對模板有了新的認知。本來我對模板的認知只是停留在stl的認知上面。對stl中容器,演算法,和智慧型指標的使用上。但最近乙個網路程式設計專案中在使用select做阻塞程式設計時用到了乙個設計模式。但是要生成的控制類太多也太繁瑣。就在此時我才想到用模板才是最好的解決辦法。inc...
《C 高階程式設計》之泛型 1建立泛型類
net自從2.0版本開始就支援泛型。閒話休提,馬上來看下非泛型的簡化鍊錶類,它可以包含任意型別的物件。linkedlistnode.cs中 在鍊錶中,乙個元素引用另乙個元素,所以必須建立乙個類,將其封裝在鍊錶中,並引用下乙個物件。1 public class linkedlistnode27 8pu...
C 模板程式設計與泛型程式設計之函式模板(一)
int sub int tv1,int tv2 float sub float tv1,float tv2 template template t sub t tv1,t tv2 呼叫 int subv sub 3,5 int subv sub 6.3,5.9 型別模板引數t 代表是乙個型別 以前前...