C 非型別引數的模版實參

2021-06-11 01:02:30 字數 1306 閱讀 5357

今天看見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 非型別模板引數

對 於函式模板與類模板,模板引數並不侷限於型別,普通值也可以作為模板引數。在基於型別引數的模板中,你定義了一些具體的細節來加以確定 直到 被調 用時這些細節才被真正的確定。但是在這裡,我們面對的是這些細節是值,而不是型別,當要使用基於值的模板時,必須顯式地指定這些值,才能夠對模板進行例項 化。在上篇...