C 非型別模板引數

2022-02-18 19:33:52 字數 2228 閱讀 9380

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

在上篇文章(c++類模板)中我們介紹了乙個stack類模板作為例子,下面將看乙個新版本的stack模板,來敘述本文將要介紹的特性:

建立類的標頭檔案

#include#include

using

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

];}

stack4.h

實現**:

#include#include

#include

#include

#include

#include

#include

"stack4.h

"using

namespace

std;

intmain()

catch(exception const&ex)

cin.

get();

return0;

}

main

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";

myclass

x; //

s是乙個指向內部連線物件的指標

但是你可以這樣使用:

template

const* name>

class

myclass ;

extern

char

const s = "

hello";

myclass

x; //

ok

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

C 非型別模板引數

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

C 非型別模板引數

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

非型別模板引數

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