C 模板高階

2021-10-06 19:00:58 字數 3105 閱讀 8054

1.非型別模板引數

模板引數分型別模板與非型別引數。

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

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

template

<

class

t, size_t n =

10>

//n就是非型別模板引數

class

array

;

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

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

2.模板的特化

2.1概念

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

template

<

class

t>

bool

isequal

(t& left, t& right)

intmain()

;char

* p2 =

newchar[6

];cout <<

isequal

(p1, p2)

<< endl;

//輸出0

//比較的是p1和p2的位址。

return0;

}

此時,就需要對模板進行轉化。在原模板類的基礎上,針對特殊型別所進行特殊化的實現方式。模板特化中分為函式模板特化與類模板特化。

2.2函式模板特化

template

<

>

bool isequal<

char

*>

(char

*& left,

char

*& right)

一般情況下如果函式模板遇到不能處理或者處理有誤的型別,為了實現簡單通常都是將該函式直接給出。

bool

isequal

(char

*& left,

char

*& right)

2.3類模板的特化

2.3.1全特化

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

template

<

classt1,

class

t2>

class

aprivate

: t1 _a;

t2 _b;};

template

<

>

class

a<

int,

int>

private

:int _a;

int _b;};

intmain()

2.3.2偏特化

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

template

<

classt1,

class

t2>

class

aprivate

: t1 _a;

t2 _b;

};

偏特化有以下兩種表現方式:

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

template

<

class

t1>

class

aint>

private

: t1 _a;

int _b;};

template

<

class

t2>

class

a<

int, t2>

private

:class_a;

t2 _b;

};

引數更近一步的限制:偏特化並不僅僅是指特化部分引數,而是針對模板引數更近一步的條件限制所設計出來的乙個特化版本。

template

<

classt1,

class

t2>

class

a, t2*

>

private

: t1* _a;

t2* _b;};

template

<

classt1,

class

t2>

class

a, t2&

>

private

: t1& _a;

t2& _b;

};

3.模板分離編譯

3.1什麼是分離編譯

乙個專案由若干個原始檔共同實現,而每個原始檔單獨編譯生成目標檔案,最後將所有目標檔案鏈結起來形成單一的可執行檔案的過程為分離編譯模式。

3.2模板的分離編譯

假設有如下場景,模板的宣告與定義分離開,在標頭檔案中進行宣告,原始檔中進行定義。

template

<

class

t>

bool

isequal

(t& left, t& right)

;template

<

class

t>

bool

isequal

(t& left, t& right)

intmain()

3.3解決方法

1.將宣告和定義放到乙個檔案裡面。

2.模板定義的位置顯示例項化。(不推薦使用)

4.模板總結

4.1優點

1.模板復用了**,節省資源,更快的迭代開發,c++的標準模板庫因此而產生的。

2.增強了**的靈活性。

4.2缺陷

1.模板會導致**膨脹問題,也會導致編譯時間變長。

2.出現模板編譯錯誤時,錯誤資訊非常凌亂,不易定位錯誤。

C 模板高階

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

C 模板高階

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

C 模板高階

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