C 模板 全特化與偏特化

2021-10-17 06:53:48 字數 2255 閱讀 8619

模板

模板定義:模板就是實現**重用機制的一種工具,它可以實現型別引數化,即把型別定義為引數, 從而實現了真正的**可重用性。模版可以分為兩類,乙個是函式模版,另外乙個是類模版。

大白話:c++是一門強型別語言,編寫一段通用的邏輯,可以把任意型別的變數傳進去處理,通過把通用邏輯設計為模板,擺脫了型別的限制,極大地提公升了**的可重用性。

**模板例項化:**模板定義本身不參與編譯,而是編譯器根據模板的使用者使用模板時提供的型別引數生成**,再進 行編譯。使用者提供不同的型別引數,就會例項化出不同的**。

類模板

類模板描述了一組相關的類或資料型別,它們只能通過型別來區分:整數值、指向(或引用)具有全域性鏈結的變數的指標、其他的組合。類模板尤其適用於描述通用但型別安全的資料結構。

類模板使用:

template 《型別形式引數》

class 類名

;template 《型別形式引數》

返回型別 類名 《型別》 :: 成員函式名1(形式引數)

... ...

template 《型別形式引數》

返回型別 類名 《型別》 :: 函式名n(形式引數)

案例:

#include using namespace std;

templateclass compare

;templatebool compare::equal(t a, t b)

int main()

類模板全特化

所謂模板全特化限定死模板實現的具體型別;

比如上述這個例子,我們比較int型別這種還可以,但是比較float這種型別就不行,這時候就需要進行模板特化;

#include using namespace std;

templateclass compare

;templatebool compare::equal(t a, t b)

//模板全特化

template<>

class compare;

bool compare::equal(float a, float b)

int main()

private:

t1 _a;

t2 _b;

};//模板全特化

template<>

class test

private:

int _a;

int _b;

};//模板偏特化

templateclass test

private:

int _a;

t _b;

};int main()

函式模板

函式模板一般定義:

template 《型別形式引數》      //型別形式引數即此格式:案例:

#include using namespace std;

//普通模板

templatebool compare(t1 a, t2 b)

int main()

函式模板特化

函式模板特化和類模板特化本質是一樣的,是對模板引數的特殊化處理:

#include using namespace std;

//普通模板

templatebool compare(t1 a, t2 b)

//函式模板特化

template<>

bool compare(const char* a, const char* b)

int main()

總結

1、函式模板只有特化,沒有偏特化;

2、模板、模板的特化和模板的偏特化都存在的情況下,編譯器在編譯階段進行匹配,優先特殊的;

3、模板函式不能是虛函式;因為每個包含虛函式的類具有乙個virtual table,包含該類的所有虛函式的位址,因此vtable的大小是確定的。模板只有被使用時才會被例項化,將其宣告為虛函式會使vtable的大小不確定。所以,成員函式模板不能為虛函式。

C 模板全特化 偏特化

大家都對c 的模板程式設計應該都能很熟練使用了,下面就是一段很簡單不過的例子了 模板函式 templatevoid func t num1,n num2 cout num1 num1 num2 num2 static bool comp t num1,n num2 return num1 特化其實就...

C 模板的偏特化與全特化

模板機制為c 提供了泛型程式設計的方式,在減少 冗餘的同時仍然可以提供型別安全。特化必須在同一命名空間下進行,可以特化類模板也可以特化函式模板,但類模板可以偏特化和全特化,而函式模板只能全特化。模板例項化時會優先匹配 模板引數 最相符的那個特化版本。c 的模板機制被證明是圖靈完備的,即可以通過模板元...

C 模板的偏特化與全特化

類模板和函式模板的宣告方式是一樣的,在類定義 模板定義之前宣告模板引數列表。例如 類模板template class a 函式模板 template t max const t lhs,const t rhs 結構體模板 template struct stacknode 通過全特化乙個模板,可以對...