寫模版多了的人,必然會遇到這樣那樣的問題,模版特例化就是解決了一個經(jīng)常碰見的問題:如果我們需要根據(jù)某些特殊的模版參數(shù)類型來重新實現(xiàn)一下算法的話,該怎么辦呢?說的多了那也沒什么用,我們就寫一個會做除法的類吧。這個類在做整數(shù)除法的時候會同時求出余數(shù),而在算其他類型時是不求的。代碼如下:
1
#include <iostream>
2
3
4
template<typename Ty>
5
class Division
6

{
7
public:
8
Division(Ty dividend, Ty divisor)
9
:mDividend(dividend), mDivisor(divisor)
{}
10
public:
11
void show()
12
{
13
std::cout<<"結(jié)果 = "<<mDividend/mDivisor<<std::endl;
14
}
15
16
Ty mDividend, mDivisor;
17
};
18
19
template<>
20
inline void Division<int>::show()
21

{
22
std::cout<<"結(jié)果 = "<<mDividend/mDivisor<<std::endl;
23
std::cout<<"余數(shù) = "<<mDividend%mDivisor<<std::endl;
24
}
25
26
27
28
29
int _tmain(int argc, _TCHAR* argv[])
30

{
31
Division<int> a(20, 11);
32
a.show();
33
34
Division<float> b(20.0f, 11.0f);
35
b.show();
36
return 0;
37
}
以上這種方式就叫做局部特化,關(guān)于全部特化和局部特化、全特化和偏特化,我認(rèn)為他們之間的關(guān)系很緊密,界限也很模糊,硬要分類的話,以上面的Division類為例,就看下面的代碼對全部特化和局部特化的區(qū)別吧:
1 /**
2 @remark
3 Division的全部特化
4 */
5 template<>
6 class Division<int>
7 {
8 public:
9 Division(Ty dividend, Ty divisor)
10 :mDividend(dividend), mDivisor(divisor){}
11 public:
12 void show()
13 {
14 std::cout<<"結(jié)果 = "<<mDividend/mDivisor<<std::endl;
15 std::cout<<"余數(shù) = "<<mDividend%mDivisor<<std::endl;
16 }
17
18 Ty mDividend, mDivisor;
19 };
20
21 /**
22 @remark
23 Division的局部特化
24 */
25 template<>
26 inline void Division<int>::show()
27 {
28 std::cout<<"結(jié)果 = "<<mDividend/mDivisor<<std::endl;
29 std::cout<<"余數(shù) = "<<mDividend%mDivisor<<std::endl;
30 }
上面的代碼只是說明了全部特化和局部特化,并沒有說明什么事全特化和偏特化。其實,對于只有一個參數(shù)的模版類型來說,并沒有什么全特化和偏特化的區(qū)別,但如果是一個以上的模板參數(shù),那就是由區(qū)別的了,如下:
1 /**
2 @remark
3 原始模板類
4 */
5 template<typename Ty, typename TyEx>
6 class ObjectData
7 {
8 //
9 };
10
11 /**
12 @remark
13 Object的全特化
14 */
15 template<>
16 class ObjectData<int, float>
17 {
18 //
19 };
20
21 /**
22 @remark
23 Object的偏特化,只特化第一個參數(shù)
24 */
25 template<typename TyEx>
26 class ObjectData<int, TyEx>
27 {
28 //
29 };
以上僅為個人觀點,錯誤之處請指正。