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