非型別引數的模板實參

2021-06-15 01:16:28 字數 2037 閱讀 6315

類模板引數也可以是乙個非型別模板引數。

例如:

templateclass screen

// ...

private:

string _screen ;

string::size_type _cursor ;

short _height ;

short _width ;

};typedef screen<24,80> termscreen ;

termscreen hp2621 ;

screen<8,24> ancientscreen ;

繫結給非型別引數的表示式必須是乙個常量表示式。即,它必須在編譯時刻被計算出結果。在前面的例子中,type termscreen引用到模板例項screen<24,80>。hi的模板實參是24,而wid的實參是80.在這兩種情況下,模板實參都是常量表示式。

但是,如果給出下面定義的類模板bufptr,那麼它的例項將導致編譯錯誤,因為來自操作符new()呼叫結果的指標值只有到執行時刻才能被知道:

templateclass bufptr

;//錯誤:模板實參不能在編譯時刻被計算出來

bufptrbp ;

類似的,非const物件的值不是乙個常量表示式,它不能被用作非型別模板引數的實參。但是,名字空間域中任何物件的位址(即便該物件不是const型別)是乙個常量表示式(而區域性物件的位址則不是)。因此,名字空間的物件的位址可以被用作非型別模板引數的實參。類似的,sizeof表示式的結果是乙個常量表示式,所以它可以被用作非型別模板引數的實參。

templateclass buf ;

templateclass buf;

int size_val = 1024 ;

const int c_size_val = 1024 ;

buf<1024> buf0 ; //正確,1024是文字常量

bufbuf1 ; //正確,c_size_val是常量

bufbuf2 ; //正確,sizeof(size_val)是常量,即sizeof(int)

buf<&size_val> bp0 ; //正確,&size_val是常量,即使size_val不是常量

bufbuf3 ; //錯誤,size_val不是常量,不能在編譯時刻被計算出來

在模板實參的型別和非型別模板實參的型別之間允許一些轉換,能被允許的轉換集是「函式實參上被允許的轉換」的子集。

1、左值轉換,包括從左值到右值的轉換,從陣列到指標的轉換,以及從函式到指標的轉換。例如:

templateclass bufptr 

int array[10] ;

bufptrbpobj ; //陣列到指標的轉換

2、限定修飾轉換。例如:

templateclass ptr 

int iobj ;

ptr<&iobj> pobj ; //從int *到const int*的轉換

3、提公升。例如:

templateclass screen ;

const short shi = 40 ;

const short swi = 132 ;

screenbpobj ; //從short到int的提公升時

4、整值轉換,例如:

templatebuf ;

buf<1024> bobj ; //從int到unsigned int的轉換

上面描述了幾種可以在模板實參的型別和非型別模板引數之間的轉換。要特別注意的一點是:整型0轉換成指標值的轉換是不允許的。例如:

templateclass bufptr ;

//錯誤:0的型別是int

//不能通過「隱式轉換」隱式的轉換到空指標

bufptr<0> nil ;

非型別形參的模板實參

模板形參不必都是型別。在呼叫函式時非型別形參將用值代替,值的型別在模板列表中指定。例如,下面的函式模板宣告了array init是乙個含有乙個型別模板形參和乙個非型別模板形參的函式模板。函式本身接受乙個形參,該形參是陣列的引用。模板非型別形參是模板定義內部的常量值,在需要常量表示式的時候,可使用非型...

C 非型別引數的模版實參

今天看見c 中關於類模版的定義有兩種,首先,類模版的定義和宣告都以關鍵字template開頭,後面接上以逗號分隔的模版參數列 template parameter list 模版參數列以 括起來,模版引數一種是型別引數 type parameter 另一種是非型別引數 nontype paramet...

非型別模板引數

這是 c templates 第四章的學習筆記。這一章和下一章可以看作是對前面介紹的函式模板和類模板的補充。這章的主要內容包括 非型別的類模板引數。非型別的函式模板引數。非型別模板引數的限制。在具體介紹以前有比較說明一下什麼是非型別的模板引數。在前面簡單介紹函式模板和類模板的時候,我們都再三說明,模...