關於模板的非型別形參,網上有很多內容,c++primer只有大概一頁的闡述,但是都不夠清晰詳細。下面我盡可能從自己的角度去給大家描述一下非型別形參的相關細節。如果想進一步理解非型別形參以及模板內容可以閱讀c++template這本書,在4.1節,8.3.3節,13.2節都有相關解釋。
模板除了定義型別引數,我們還可以在模板定義非型別引數。
什麼是非型別形參?顧名思義,就是表示乙個固定型別的常量而不是乙個型別。
先舉乙個簡單的例子(模板類與模板函式都可以用非型別形參)
//例子1:
template
class list {
private:
t elems[maxsize];
public:
print() {
cout
<<"the maxsize of list is"
list;
list.print(); //列印"the maxsize of list is 5"
這個固定型別是有侷限的,只有整形,指標和引用才能作為非型別形參,而且繫結到該形參的實參必須是常量表示式,即編譯期就能確認結果。
這裡要強調一點,我們對於非型別形參的限定要分兩個方面看
1.對模板形參的限定,即template<>裡面的引數
2.對模板實參的限定,即例項化時<>裡面的引數
下面逐個解釋一下非型別形參的侷限
1.浮點數不可以作為非型別形參,包括float,double。具體原因可能是歷史因素,也許未來c++會支援浮點數。
2.類不可以作為非型別形參。
3.字串不可以作為非型別形參
4.整形,可轉化為整形的型別都可以作為形參,比如int,char,long,unsigned,bool,short(enum宣告的內部資料可以作為實參傳遞給int,但是一般不能當形參)
5.指向物件或函式的指標與引用(左值引用)可以作為形參
下面解釋一下非型別實參的侷限
1.實參必須是編譯時常量表示式,不能使用非const的區域性變數,區域性物件位址及動態物件
2.非const的全域性指標,全域性物件,全域性變數(下面可能有個特例)都不是常量表示式。
3.由於形參的已經做了限定,字串,浮點型即使是常量表示式也不可以作為非型別實參
備註:常量表示式基本上是字面值以及const修飾的變數
模板非型別形參
今天看c primer看到16.4.2節內容,非型別形參的模板實參 自己突發奇想非型別形參是否支援型別轉換,於是鍵入double型資料,編譯器提示模板形參錯誤 vs2010,error 表示式必須包含整數或列舉型別 可見不僅不支援型別轉換,更不能允許形參為整型與列舉型別之外的型別。不見黃河不死心,於...
模板非型別形參
今天看c primer看到16.4.2節內容,非型別形參的模板實參 自己突發奇想非型別形參是否支援型別轉換,於是鍵入double型資料,編譯器提示模板形參錯誤 vs2010,error 表示式必須包含整數或列舉型別 可見不僅不支援型別轉換,更不能允許形參為整型與列舉型別之外的型別。不見黃河不死心,於...
C 模板非型別形參的詳細講解
前言 關於模板的非型別形參,網上有很多內容,c primer只有大概一頁的闡述,但是都不夠清晰詳細。下面我盡可能從自己的角度去給大家描述一下非型別形參的相關細節。如果想進一步理解非型別形參以及模板內容可以閱讀c template這本書,在4.1節,8.3.3節,13.2節都有相關解釋。模板除了定義型...