模板模板定義:模板就是實現**重用機制的一種工具,它可以實現型別引數化,即把型別定義為引數, 從而實現了真正的**可重用性。模版可以分為兩類,乙個是函式模版,另外乙個是類模版。
大白話: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 通過全特化乙個模板,可以對...