一、概念
通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错
误的结果。
template<class T>
bool IsEqual(T& left, T& right)
{
return left == right;
}
void main()
{
char* p1 = "hello";
char* p2 = "world";
if(IsEqual(p1, p2))
cout << "p1=p2" << endl;
else
cout << "p1!=p2" << endl;
}
此时,就需要对模板进行特化。即:在原模板类的基础上,针对特殊类型所进行特殊化的实现方
式。模板特化中分为函数模板特化与类模板特化。
二、模板特化
1.函数模板特化
函数模板特化步骤:
1. 必须要先有一个基础的函数模板。
2. 关键字template后面接一对空的尖括号<>。
3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型。
4. 函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。
//模板的特化---特殊化
template<>
bool IsEqual<const char *>(const char*& left,const char*& right)
{
return strcmp(left, right) == 0;
}
template<>
bool IsEqual<int>(int& left, int& right)
{
return left == right;
}
void main()
{
int a = 20;
int b = 30;
bool flag = IsEqual(a,b);
const char p1[] = "hello";
const char p2[] = "world";
if (IsEqual(p1, p2))
cout << "p1=p2" << endl;
else
cout << "p1!=p2" << endl;
}
2.类模板特化
全特化:将模板参数列表中所有的参数都确定化。
template<class T1, class T2>
class Data
{
public:
Data()
{
cout << "Data<T1, T2>" << endl;
}
private:
T1 _d1;
T2 _d2;
};
template<>
class Data<int, char>
{
public:
Data()
{
cout << "Data<int, char>" << endl;
}
private:
int _d1;
char _d2;
};
void main()
{
Data<int, int> d1;
Data<int, char> d2;
}
偏特化:任何针对模版参数进一步进行条件限制设计的特化版本。
// 将第二个参数特化为int
template<class T1, class T2>
class Data
{
public:
Data()
{
cout << "Data<T1, T2>" << endl;
}
private:
T1 _d1;
T2 _d2;
};
template <class T1>
class Data<T1, int>
{
public:
Data()
{
cout << "Data<T1, int>" << endl;
}
private:
T1 _d1;
int _d2;
};
void main()
{
Data<int, int> d1;
Data<int, char> d2;
}