在使用模板时,可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果。这时就一些需要特殊处理(对模板进行特化)。
在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。
模板特化又分为:函数模板特化、类模板特化。
template<class T>
bool IsEqual(T& left, T& right)
{
return left == right;
}
上述模板判断是否相等。若我们传两个字符串进行比较,对于字符串而言不能直接比较。因不能直接使用当前的模板函数,所以此时我们就需要对该类型特化出一个模板函数(就是写出一个模板函数专门给该类型使用)。
函数模板特化规则:
1. 必须要先有一个基础的函数模板
2. template后接空的尖括号<>
3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型
4. 函数形参表: 必须要和模板函数的基础参数类型完全相同
加上下面这段特化字符串就能比较了
template<>
bool Isequal<char*>(char*& p1, char*& p2){
return strcmp(p1, p2) == 0;
}
类模板特化又分为:全特化、偏特化。
全特化:将模板参数类表中所有的参数都确定化
template <class T1, class T2>
class Test1{
}
//全特化
template <>
class Test1<int , char>{
}
偏特化:任何针对模版参数进一步进行条件限制设计的特化版本。
偏特化又为两种:部分特化、参数更进一步限制。
部分特化:将模板参数类表中的一部分参数特化
template <class T1, class T2>
class Test2{
}
//部分特化
template <class T1> //此处只需写未进行特化的模板类型,特化过的就不用写
class Test2<T1 , char>{
}
参数更进一步限制:
template <class T1, class T2>
class Test2{
}
//两个参数偏特化为指针类型
template <class T1 , class T2 >
class Test2<T1* , T2*>{
}
//两个参数偏特化为引用类型
template <class T1 , class T2 >
class Test2<T1& , T2&>{
}
Test2<double , char> d1; // 调用特化的char版本
Test2<int , double> d2; // 调用基础的模板
Test2<int *, int*> d3; // 调用特化的指针版本
Test2<int&, int&> d4(1, 2); // 调用特化的引用版本