今天看見c++中關於類模版的定義有兩種,首先,類模版的定義和宣告都以關鍵字template開頭,後面接上以逗號分隔的模版參數列(template parameter list),模版參數列以<>括起來,模版引數一種是型別引數(type parameter),另一種是非型別引數(nontype parameter)。關於型別引數模版不多說了,有關鍵字class或typename接上後面的識別符號構成,例如templatetemplate ,對於非型別引數模版(nontype parameter)需要注意的是它由普通引數宣告構成的,它代表類模版中的乙個常量,例如定義template,這之後就要注意了,給定的非型別引數的表示式必須是乙個常量表示式,但是名字空間域的物件的位址可以被用作非型別模版引數的實參,因為名字空間域任何物件的位址是常量表示式(即使不是const定義的),而區域性物件的位址不是。例如 template class a{}; template class ap{}; int size=11; const int size_ =12; 則以下的表示式都是可以的 :
a<11> a0;
aa1;
aa2;
ap<&size> b0;
值得注意的是,如果乙個非型別引數模版的兩個表示式的值結果相等,則認為是等價的模版實參,例如screen<1+2+3,4> s1和screen<6,2*2> s2認為是引用同一模版例項screen<6,4>。
指出下面哪些模版的例項化是有效的?
template < int *ptr > class ptr ;
template < class type, int size > class fixed_array ;
template < int hi, int wid > class screen ;
(a) const int size = 1024;
ptr< &size > bp1;
(b) int arr[10];
ptr< arr > bp2;
(c) ptr < 0 > bp3;
(d) const int hi = 40;
const int wi = 80;
screen< hi, wi+32 > sobj;
(e) const int size_val = 1024;
fixed_array< string, size_val > fa1;
(f) unsigned int fasize = 255;
fixed_array< int, fasize > fa2;
(g) const double db = 3.1415;
fixed_array< double, db > fa3;
非型別引數的模板實參
類模板引數也可以是乙個非型別模板引數。例如 templateclass screen private string screen string size type cursor short height short width typedef screen 24,80 termscreen term...
C 非型別模板引數
對於函式模板與類模板,模板引數並不侷限於型別,普通值也可以作為模板引數。在基於型別引數的模板中,你定義了一些具體的細節來加以確定 直到 被呼叫時這些細節才被真正的確定。但是在這裡,我們面對的是這些細節是值,而不是型別,當要使用基於值的模板時,必須顯式地指定這些值,才能夠對模板進行例項化。在上篇文章 ...
C 非型別模板引數
對 於函式模板與類模板,模板引數並不侷限於型別,普通值也可以作為模板引數。在基於型別引數的模板中,你定義了一些具體的細節來加以確定 直到 被調 用時這些細節才被真正的確定。但是在這裡,我們面對的是這些細節是值,而不是型別,當要使用基於值的模板時,必須顯式地指定這些值,才能夠對模板進行例項 化。在上篇...