C 非型別模板引數的應用理解

2021-10-23 05:26:53 字數 1838 閱讀 6862

模板引數可以是表示型別的型別形參,也可以是表示常量表示式的非型別形參

型別形參:出現在模板引數列表中,跟在關鍵字 class 或 typename 之後定義,例如,class t 是名為 t 的型別形參,在這裡 class 和 typename 沒有區別。

非型別形參:就是用乙個常量作為類(函式)模板的乙個引數,在類(函式)模板中可將該引數當成常量來使用。

**示例:

namespace bit

const t&

operator

(size_t index)

const

size_t size()

const

bool

empty()

const

private

: t _array[n]

; size_t _size;};

}

注意:

浮點數、類物件以及字串是不允許作為非型別模板引數的。

非型別的模板引數在編譯期就能確認結果。

要點總結

模板在定義時候可以在尖括號裡定義乙個常量,作為引數。例如:template < class t, size_t n = 10 >。

2、傳入的時候必須是const型別的資料。

通常用作給某個陣列傳長度。

有如下類模板定義:

template<typename t>

class

bignumber

long n;

public

:bignumber

(ti):n

(i) bignumberoperator+(bignumberb)

};

已知b1、b2是bignumber的兩個物件,則下列表示式中錯誤的是( )。

a.b1+b2

b.b1+3

c.3+b1

d.3+3

標準答案:c

答案解析:

c++運算子的過載有兩個方式,一種是做為成員函式,另一種是做為友無函式。前種c++預設省略第乙個引數(事實上是物件本身),而後一種是所有的引數都要寫全。比如對加法的過載:成員方式為coperator operator+(coperator &op);,在呼叫的過程中我們可以理解為result=operator+(op);友元方式為friend coperator operator-(coperator &op1, coperator &op2);,在呼叫的過程中我們可以理解為result=operator-(op1, op2);

成員函式的話有個this指標,所以要想呼叫成員函式operator+ 的話前面的變數必須要是類物件

選項解析:

a.b1+b2 : 是bignumber(b1)+bignumber(b2)

b.b1+3 : 是bignumber(b1)+bignumber(3)

c.3+b1 : 整數3與b1相加時,3是int型,b1是bignumber<t>型,int型不能和別的型做運算。常數3無法匹配到此模版中的+過載函式,編譯器無法識別

d.3+3 : 就是正常的3+3

C 非型別模板引數

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

C 非型別模板引數

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

C 非型別模板引數

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