一、類模板的深入學(xué)習(xí):
1、類模板可以定義任意多個(gè)不同的類型參數(shù)(這一點(diǎn)和模板函數(shù)一樣)
template < typename T1, typenaem T2 >
class Test
{
public:
void add(T1 a, T2 b);
}
//定義類對(duì)象時(shí)
Test
2、類模板可以被特化
指定類模板的特定實(shí)現(xiàn)
部分類參數(shù)必須顯示指定
根據(jù)類型參數(shù)分開實(shí)現(xiàn)類模板
特化前:
template < typename T1, typename T2 >
class Test
{
};
特化后:
template < typename T >
class Test < T , T >
{
};
3、類模板的特化類型:
部分特化:用特定的規(guī)則約束類型參數(shù)
完全特化:完全顯示指定類型參數(shù)
完全特化前:
template
完全特化后:
template < >
class Test < int, int>
{
};
代碼實(shí)踐:
#include
輸出結(jié)果:
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、類模板特化注意事項(xiàng):
(1)特化只是模板的分開實(shí)現(xiàn)
本質(zhì)上是同一個(gè)類模板
(2)特化類模板的使用方式是統(tǒng)一的
必須顯示指定每一個(gè)類型參數(shù)
5、類模板特化與重定義有區(qū)別嗎?函數(shù)模板可以特化嗎?
(1)重定義和特化的不同:
重定義:
--一個(gè)類模板和一個(gè)新類(或者兩個(gè)類模板)
--使用的時(shí)候需要考慮如何選擇的問題
特化:
--以統(tǒng)一的方式類使用類模板的特化類
--編譯器自動(dòng)優(yōu)先選擇特化類
(2)函數(shù)模板只支持參數(shù)完全特化
函數(shù)模板特化前:
template < typename T >
bool Equal(T a, T b)
{
return a==b;
}
函數(shù)模板完全特化后:
template < >
bool Euqal
代碼實(shí)踐:
#include
輸出結(jié)果:
root@txp-virtual-machine:/home/txp# ./a.out
bool Equal(T a, T b)
1
bool Equal
注解:當(dāng)需要重載函數(shù)模板時(shí),優(yōu)先考慮使用模板特化;當(dāng)模板特化無法滿足需求,再使用函數(shù)重載
二、總結(jié):
類模板可以定義任意多個(gè)不同的類型參數(shù)
類模板可以被部分特化和完全特化
特化的本質(zhì)是模板的分開實(shí)現(xiàn)
函數(shù)模板只支持完全特化
工程中使用模板特化代替類(函數(shù))重定義
好了,今天的分享就到這里,如果文章中有錯(cuò)誤或者不理解的地方,可以交流互動(dòng),一起進(jìn)步。我是txp,下期見!
-
可編程邏輯
+關(guān)注
關(guān)注
7文章
515瀏覽量
44083 -
C++
+關(guān)注
關(guān)注
22文章
2108瀏覽量
73623
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論