c++ 模板特化與局部特化
模板的由來是要處理泛化,也就是任何類型都可以處理。但是泛化的同時,如果針對某種特殊的類型,又更加效率的處理方法。c++提供針對特殊的類型,可以定義不同的處理方法。針對某種特殊類型去處理的方式就叫做特化。
特化分全部特化和局部特化
全部特化:
template<typename T> class test{
T i;
};
template<> class test<int>{
int i;
};
通過上面的例子可以看出,可以針對類型int,定義一個新的處理。當外部使用時,穿進來的類型是int的話,就會進入到特化定義的類里。
局部特化種類1:把模板類型列表里,部分的類型,特化。
template<typename T, typename M> class test{
T i;
M m;
};
template<typename M> class test<bool, M>{
int i;
};
上面的例子,把類型T特化了,類型M保留了,所以是部分特化。也就是當外部使用時,穿進來的T的類型是bool類型的話,就進入到特化定義的類里。
局部特化種類2:限定泛化類型,比如限定成指針。
template<typename T> class test{
T i;
};
template<typename T> class test<T*>{
T i;
};
template<typename T> class test<const T*>{
T i;
};
上面的例子,把類型限定了,如果外部穿進來的是指針則有特殊的處理,如果穿進來的是const指針,則有另外的特殊處理。