C 模板高階

2021-09-25 21:29:35 字數 2144 閱讀 8029

模板引數分類型別形參與非型別形參。

型別形參即:出現在模板引數列表中,跟在class或者typename之類的引數型別名稱。

非型別形參,就是用乙個常量作為類(函式)模板的乙個引數,在類(函式)模板中可將該引數當成常量來使用.

// 定義乙個模板型別的靜態陣列

template10>

class array

const t& operator[

](size_t index)

const

size_t size()

const

bool empty()

const

private:

t _array[n]

; size_t _size;

};

浮點數、類物件以及字串是不允許作為非型別模板引數的。

非型別的模板引數必須在編譯期就能確認結果。

通常情況下,使用模板可以實現一些與型別無關的**,但對於一些特殊型別的可能會得到一些錯誤的結

果,比如:

template

bool isequal

(t& left, t& right)

void

test()

函式模板的特化步驟:

必須要先有乙個基礎的函式模板

關鍵字template後面接一對空的尖括號<>

函式名後跟一對尖括號,尖括號中指定需要特化的型別

函式形參表: 必須要和模板函式的基礎引數型別完全相同,如果不同編譯器可能會報一些奇怪的錯誤。

template<

>

bool isequal<

char

*>

(char

*& left,

char

*& right)

// 一般情況下如果函式模板遇到不能處理或者處理有誤的型別,

// 為了實現簡單通常都是將該函式直接給出。

bool isequal

(char

* left,

char

* right)

全特化

全特化即是將模板引數類表中所有的引數都確定化。

template

class data

private:

t1 _d1;

t2 _d2;};

template<

>

class data<

int,

char

>

private:

int _d1;

char _d2;};

void

testvector()

偏特化

偏特化:任何針對模版引數進一步進行條件限制設計的特化版本。比如對於以下模板類:

template

class data

private:

t1 _d1;

t2 _d2;

};

偏特化有已下兩種表現方式

部分特化

將模板引數類表中的一部分引數特化

// 將第二個引數特化為int

template

class dataint>

private:

t1 _d1;

int _d2;

};

引數更進一步的限制

偏特化並不僅僅是指特化部分引數,而是針對模板引數更進一步的跳進限制所設計出來的一種特化版本。

//兩個引數偏特化為指標型別

template

class data , t2*

>

private:

t1 _d1;

t2 _d2;};

template

class data , t2&

>

private:

const t1 & _d1;

const t2 & _d2;};

void test2 (

)

C 模板高階

模板引數分為類型別形參和非型別形參。類型別形參 出現在模板引數列表中,跟在class或者typename之後類的引數型別名稱。非型別形參 用乙個常量作為類 函式 模板的乙個引數,在類 函式 模板中可將該引數當成常量來使用。注意 通常情況下,使用模板可以實現一些與型別無關的 但一些特殊型別的可能會得到...

C 模板高階

模板引數分為類型別形參和非型別形參。類型別形參 出現在模板引數列表中,跟在class或者typename之類的引數型別名稱。非型別形參 就是用乙個常量作為類 函式 模板的乙個引數,在類 函式 模板中可將該引數當成常量來使用。示例 定義乙個模板型別的靜態陣列。template class t,size...

C 模板高階

模板引數分為型別形參與非型別形參。型別形參 出現在模組引數列表中,跟在class或者typename之類的引數型別名稱。非型別形參 用乙個常量作為類 函式 模板的乙個引數,在類 函式 模板中可將該引數當成常量來使用。注意 浮點數 類物件以及字串是不允許作為非型別模板引數的。非型別的模板引數必須在編譯...