一、類模板的深入學習:
1、類模板可以定義任意多個不同的類型參數(這一點和模板函數一樣)
template < typename T1, typenaem T2 >
class Test
{
public:
void add(T1 a, T2 b);
}
//定義類對象時
Test
2、類模板可以被特化
指定類模板的特定實現
部分類參數必須顯示指定
根據類型參數分開實現類模板
特化前:
template < typename T1, typename T2 >
class Test
{
};
特化后:
template < typename T >
class Test < T , T >
{
};
3、類模板的特化類型:
部分特化:用特定的規則約束類型參數
完全特化:完全顯示指定類型參數
完全特化前:
template
完全特化后:
template < >
class Test < int, int>
{
};
代碼實踐:
#include
輸出結果:
root@txp-virtual-machine:/home/txp# ./a.out
void add(T1 a, T2 b)
3.5
void add(T a, T b)
10
class Test < T , T >
void add(void* a, void* b)
error to add void* parm
void add(T1* a, T2* b)
1.1
4、類模板特化注意事項:
(1)特化只是模板的分開實現
本質上是同一個類模板
(2)特化類模板的使用方式是統一的
必須顯示指定每一個類型參數
5、類模板特化與重定義有區別嗎?函數模板可以特化嗎?
(1)重定義和特化的不同:
重定義:
--一個類模板和一個新類(或者兩個類模板)
--使用的時候需要考慮如何選擇的問題
特化:
--以統一的方式類使用類模板的特化類
--編譯器自動優先選擇特化類
(2)函數模板只支持參數完全特化
函數模板特化前:
template < typename T >
bool Equal(T a, T b)
{
return a==b;
}
函數模板完全特化后:
template < >
bool Euqal
代碼實踐:
#include
輸出結果:
root@txp-virtual-machine:/home/txp# ./a.out
bool Equal(T a, T b)
1
bool Equal
注解:當需要重載函數模板時,優先考慮使用模板特化;當模板特化無法滿足需求,再使用函數重載
二、總結:
類模板可以定義任意多個不同的類型參數
類模板可以被部分特化和完全特化
特化的本質是模板的分開實現
函數模板只支持完全特化
工程中使用模板特化代替類(函數)重定義
好了,今天的分享就到這里,如果文章中有錯誤或者不理解的地方,可以交流互動,一起進步。我是txp,下期見!
-
可編程邏輯
+關注
關注
7文章
514瀏覽量
44072 -
C++
+關注
關注
22文章
2104瀏覽量
73489
發布評論請先 登錄
相關推薦
評論