對 於函式模板與類模板,模板引數並不侷限於型別,普通值也可以作為模板引數。在基於型別引數的模板中,你定義了一些具體的細節來加以確定**,直到**被調 用時這些細節才被真正的確定。但是在這裡,我們面對的是這些細節是值,而不是型別,當要使用基於值的模板時,必須顯式地指定這些值,才能夠對模板進行例項 化。
在上篇文章(c++類模板)中我們介紹了乙個stack類模板作為例子,下面將看乙個新版本的stack模板,來敘述本文將要介紹的特性:
建立類的標頭檔案
#include#includeusing實現**:namespace std;
templateint maxsize>
class stack
bool full() const
};templateint maxsize>
stack::stack():numelems(0) {}
templateint maxsize>
void stack::push(t const& elem)
elems[numelems] = elem;
++numelems;
}templateint maxsize>
void stack::pop()
--numelems;
}templateint maxsize>
t stack::top() const
return elems[numelems - 1];
}
#include#include#include#include#includemaxsize是新加入的第二個模板引數,型別為int,它指定了陣列最多可包含的棧元素的個數#include#include "
stack4.h
"using
namespace std;
int main()
cin.get();
return
0;}
同樣,我們可以為模板引數指定預設值:
templateint, int maxsize = 100>你也可以為函式模板定義非型別引數。例如:class
stack ;
templateint val>借助於stl,可以傳遞這個函式模板的例項化給集中的每乙個元素,讓他們都增加乙個整數值:t addvalue(t const& x)
std::transform(source.begin(), source.end(), dest.begin(), (int(*)(int非型別模板引數是有限制的,通常而言,它們可以是常整數(包括列舉值)或者指向外部鏈結物件的指標。const&))addvalue);
浮點數和類物件是不允許作為非型別模板引數的:
template另外,你也不能使用全域性指標作為模板引數:double process(double v) //
error
template //
error
class myclass ;
template但是你可以這樣使用:const* name>
class myclass;
char
const* s = "
hello
";myclassx; //
s是乙個指向內部連線物件的指標
template全域性字元陣列s由"hello"初始化,是乙個外部鏈結物件const* name>
class myclass ;
extern
char
const s = "
hello
";myclassx; //
ok
C 非型別模板引數
對於函式模板與類模板,模板引數並不侷限於型別,普通值也可以作為模板引數。在基於型別引數的模板中,你定義了一些具體的細節來加以確定 直到 被呼叫時這些細節才被真正的確定。但是在這裡,我們面對的是這些細節是值,而不是型別,當要使用基於值的模板時,必須顯式地指定這些值,才能夠對模板進行例項化。在上篇文章 ...
C 非型別模板引數
對於函式模板與類模板,模板引數並不侷限於型別,普通值也可以作為模板引數。在基於型別引數的模板中,你定義了一些具體的細節來加以確定 直到 被呼叫時這些細節才被真正的確定。但是在這裡,我們面對的是這些細節是值,而不是型別,當要使用基於值的模板時,必須顯式地指定這些值,才能夠對模板進行例項化。在上篇文章 ...
非型別模板引數
這是 c templates 第四章的學習筆記。這一章和下一章可以看作是對前面介紹的函式模板和類模板的補充。這章的主要內容包括 非型別的類模板引數。非型別的函式模板引數。非型別模板引數的限制。在具體介紹以前有比較說明一下什麼是非型別的模板引數。在前面簡單介紹函式模板和類模板的時候,我們都再三說明,模...