模板即是对类型的一种泛化,当我们的模板对某种特定类型有特定的实现时,模板特化即是一个很好的解决方案。
一、模板特化
template<typename T>
class sample { ... };//泛化模板类
template <>
class sample<int> { ... };//模板特化,可以理解为泛化的类型被从template中抽出来绑定为int了
上述特化即表示当类型为int时,有一套和其他类型不同的处理方案,而除int以外的其他类型则由上面的泛化模板生成定义。
二、部分特化
除了全部特化,模板还可以部分特化,而部分特化又可分为个数部分特化和范围部分特化
1.个数部分特化(模板参数的个数)
template<typename T, typename Alloc = alloc>
class vector{ ... };
template<typename Alloc>
class vector<bool, Alloc> { ... };//表示当bool存储的类型为bool时,vector有另一套实例化方案
//这很正常,通常这种特化是为了提高效率(或是泛化模板不符合要求),比如特化采用1bit来存储bool值
//而不是用int来存储
2.范围部分特化
template<typename T>
class example { ... };
templace<typename T>
class example<T*> { ... };//指定当T为指针时,使用特化的模板来实例化,而对于指针指向何种类型
//不做限定,由于T指向的类型任意,只是当T为指针时才特化,所以不能从template里将T抽出来
template<typename T>
class example<const T*> { ... };//当T为const *时才特化