C Template 基礎 非型別模板引數

2021-09-01 02:10:15 字數 2475 閱讀 1577

目錄

4 非型別模板引數

4.1 非型別的類模板引數

4.2 非型別的函式模板引數

4.3 非型別模板引數的限制

4.4 小結

對於函式模板和類模板, 模板引數並不侷限於型別, 普通值也可以作為模板引數。 在基於型別引數的模板中, 你定義了一些具體細節未加確定的**, 直到**被呼叫時這些細節才被真正確定。 然而, 在這裡, 我們面對的這些細節是值(value) , 而不是型別。 當要使用基於值的模板時, 你必須顯式地指定這些值, 才能夠對模板進行例項化, 並獲得最終**。

較之前一章stack例子的實現, 你也可以使用元素數目固定的陣列來實現stack。用固定大小的陣列的優點是: 無論是由你來親自管理記憶體, 還是由標準容器來管理記憶體, 都可以避免記憶體管理開銷。然而, 決定乙個棧(stack) 的最佳容量是很困難的。 如果你指定的容量太小, 那麼棧可能會溢位; 如果指定的容量太大, 那麼可能會不必要地浪費記憶體。 乙個好的解決方法就是: 讓棧的使用者親自指定陣列的大小,並把它作為所需要的棧元素的最大個數。

為了做到這一點, 你需要把陣列大小定義為乙個模板引數:

template class stack 

bool full() const };

// 建構函式

template stack::stack()

: numelems(0) // 初始時棧不含元素

template void stack::push(t const& elem)

templatevoid stack::pop()

--numelems; // 減少元素的個數

} template t stack::top() const

return elems[numelems - 1]; // 返回最後乙個元素

}

maxsize是新加入的第2個模板引數, 型別為int; 它指定了陣列最多可包含的棧元素的個數。

為了使用這個類模板, 你需要同時指定元素的型別和個數(即棧的最大容量):

int main()

catch(std::exception const& ex)

}

可以看出, 每個模板例項都具有自己的型別, 因此 int20stack 和int40stack 屬於不同的型別, 而且這兩種型別之間也不存在顯式或者隱式的型別轉換; 所以它們之間不能互相替換, 更不能互相賦值。

同樣, 我們可以為模板引數指定預設值:

templateclass stack 

;

你也可以為函式模板定義非型別引數。 例如, 下面的函式模板定義了一組用於增加特定值的函式:

templatet addvalue(t const& x)

如果需要把函式或者操作用作引數的話, 那麼這類函式就是相當有用的。 譬如, 借助於stl, 你可以傳遞這個函式模板的例項化體給集合中的每乙個元素, 讓它們都增加乙個整數值:

std::transform(source.begin(), source.end(), //源集合的起點和終點

dest.begin(), //目標集合的起點

addvalue);

非型別模板引數是有限制的。 通常而言, 它們可以是常整數(包括列舉值) 或者指向外部鏈結物件的指標。浮點數和類物件是不允許作為非型別模板引數的。

template//error:浮點數不能作為非型別模板引數

double process(double v)

template//error:類物件不能作為非型別模板引數

class myclass

;

由於字串文字是內部鏈結物件(因為兩個具有相同名稱但處於不同模組的字串, 是兩個完全不同的物件) , 所以你不能使用它們來作為模板實參:

templateclass myclass 

;myclass<"hello"> x; //error:不允許使用字串文字"hello"

另外, 你也不能使用全域性指標作為模板引數:

template class myclass 

;char const* s = "hello";

myclassx; //s是乙個指向內部鏈結物件的指標

然而,你可以這樣使用:

template class myclass 

;extern char const s = "hello";

myclassx; //ok

全域性字串陣列s由"hello"初始化,是乙個外部連線物件。

•模板可以具有值模板引數, 而不僅僅是型別模板引數。

•對於非型別模板引數, 你不能使用浮點數、 class 型別的物件和內部鏈結物件(例如string) 作為實參。

非型別模板引數

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

C 非型別模板引數

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

C 非型別模板引數

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