C++中的特化和偏特化
模板特化
如下是泛型编程中的模板方法:
template <class Key>
class hash{
};
特化就是相对于Key参数来说的,如果没有特化的话,所有的Key参数都会应用上面的类的实现,但是如下定义几个特殊Key参数的class的类,当使用到不同的Key值时首先应用于当前特化的版本:
template<>
class hash<char>{
size_t operator()(char x) const {return x;}
};
template<>
class hash<int>{
size_t operator()(int x) const {return x;}
};
template<>
class hash<long>{
size_t operator()(long x) const {return x;}
};
模板偏特化
这种“偏”从两个方面来进行描述:个数上的“偏”,范围上的“偏”。
个数上的偏
对于有多个参数的模板,我们可以挑选几个参数来进行特化,这就叫做偏特化(个数上)在进行个数上的偏时,需要注意一个规则,从左到右不能有间隔性的偏,也就是偏需要相邻不能进行跳跃,即当有多个参数的时候时不能出现如1,3,5参数特化的情况:
template<typename T, typename Alloc=...>
class vector
{
...
};
template<typename Alloc=...>
class vector<bool, Alloc>
{
...
};
范围上的偏
当泛化的参数中,我们需要用到一些特殊的范围,比如下面泛型代码参数T可以用来表示任何数据类型,如果你想要特化指针类,则专门为指针定义一个特化版本:
template <typename T>
class C
{
...
};
template <typename T>
class C<T*>
{
...
};
template <typename U>
class C<U*>
{
...
};
C< string > obj1; C< string* > obj2;//调用特化版本
**总结:**特化以及偏特化就是当我们进行类设计的时候,有一些特殊情况能够以单独的方法进行处理会比与其它类型用同种方法进行处理更加的高效或者更加好,则就会单独设计这个情况的处理。
|