C 非型別模板引數

2021-09-23 21:27:23 字數 2014 閱讀 6200

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

在上篇文章(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#include

#include#include "

stack4.h

"using

namespace std;

int main()

cin.get();

return

0;}

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

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

templateint, int maxsize = 100>

class

stack ;

你也可以為函式模板定義非型別引數。例如:

templateint val>

t addvalue(t const& x)

借助於stl,可以傳遞這個函式模板的例項化給集中的每乙個元素,讓他們都增加乙個整數值:

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

const* name>

class myclass ;

extern

char

const s = "

hello

";myclassx; //

ok

全域性字元陣列s由"hello"初始化,是乙個外部鏈結物件

C 非型別模板引數

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

C 非型別模板引數

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

非型別模板引數

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