特化的解释
即便是有函数模版和类模版,但总有一些情况,使得一个通用的模版并不能解决所有问题,比如:
该函数是想输出传进来的值,但如果传入的是指针,则会出错。
template<class T1, class T2>
void Print(T1 x, T2 y)
{
std::cout << x << std::endl;
std::cout << y << std::endl;
}
这时,就需要对传入指针的这种特殊情况做特殊的处理,该处理就叫做模版特化。
函数模版的全特化
还是针对上面函数模版例子,做如下特殊处理(特化)
template<>
void Print<int*, int*>(int *x, int *y)
{
std::cout << *x << std::endl;
std::cout << *y << std::endl;
}
类模版的全特化
这是类模版
template<class T1, class T2>
class Data
{
//Code
};
类模版全特化
template<>
class Data<int, double>
{
//Code
};
template<>
class Data<int, int>
{
//Code
};
template<>
class Data<char, char>
{
//Code
};
类模版的偏特化
针对上面类模版做偏特化
template<class T>
class Data<T, int>
{
//Code
};
template<class T>
class Data<T, double>
{
//Code
};
template<class T>
class Data<char, T>
{
//Code
};
特化的补充
-
全特化:对模版所有类型参数做处理;
-
偏特化:对模版部分类型参数做处理;
-
函数模版没有偏特化;
-
函数模版的全特化与函数重载很像,但并不是一回事;
-
类模版特化由于会导致代码量剧增,所以一般作用于仿函数;
-
编译器选择模版的顺序为(先寻找最合适的模版):模版全特化——>模版偏特化——>普通模版。