泛型编程核心思想是类型泛化,实际项目开发过程中往往会存在很多特例,这些特例中可以利用特例特性简化事情的处理。为了匹配这种问题,泛型编程中引入特化和偏特化概念。和泛化编程相比较,特化就是泛化的基础上对某种类型再进行一次特殊类型的内容。也就是泛化的基础上我们发现这种内容针对某种内容还是有特殊处理的,就会针对某种类型进行一次特化。偏特化是特化中的部分内容发生特化,而另外一部分还保留原有的样子。
1. 全特化
全特化是完全显示指定类型的参数。完全特化就是我们根本就不需要泛指参数了,直接指定原先的泛指类型全部为int,完全特化意味着特化之后的模板里面已经没有了泛指类型。
template <typename T1, Typename T2> template <>
class CText{ class CText <int, int>{
}; };
2. 偏特化
偏特化分为个数上面的偏特化和范围上的偏特化。函数存在重载和重定义的特性,函数推导过程必须要依次精确匹配,函数不存在偏特化。当我们使用模板时,如果指定了参数都为int,则编译器选择右边的实现。
函数模板编译器会对模板进行参数推到(argument deduction)工作,类模板不具备这个功能,必须使用<T>告知编译器类型。分析原因,主要是类模板一般是最开始使用,这个时候没有任何线索对数据进行推到。
工程中建议当需要重载函数模板时,优先考虑使用模板特化,只有模板特化没有办法满足是才考虑使用函数重载。