目录 Table of Contents
partial specialization 模板偏特化
个数的偏
这个模板如果有两个模板参数
template<typename T, typename Alloc=/*...*/> // 两个模板参数
class vector
{
//...
};
你想绑定其中一个, 比如说这个 vector 允许你指定元素类型, 以及指定一个分配器, 必须指定这两个, 这里有一个默认值
你在设计的时候, 如果这个元素是 boolean 值的话, 好像我应该有特殊的设计
因为在 C++ 里面最小的数据类型, 有 8 个比特形成的 1 个字节
如果你让 1 个字节去代表一个 boolean 值的话, 那就会浪费
所以如果要放的是 0 或 1 真假值的话, 我觉得我可以单独为它设计而不是用泛化
因此, 我要告诉编译器, 这里有两个模板参数, 我说我现在只剩下一个了, 因为另外一个被我绑定了, 这个 T 就是写到下面变成 boolean.
这就是关于个数上的偏特化的语法
template<typename Alloc=/*...*/>
class vector<bool, Alloc>
{
//...
};
范围的偏
如果我设计接受 P, P 是任意类型, 如果我把范围缩小一点, 说它是一个指针, 指针指向任意类型, 从任意类型缩小成指针
如果你有这种用途的话, C++ 允许这种想法
那么怎么做呢 ?
//泛化
template<typename T>
class C
{
//...
};
你先写一个上面那样的东西, 接受任意的 T
//特化
template<typename T>
class C<T*>
{
//...
};
然后你写一个偏特化版本的, 告诉编译器说, 如果使用者用的是指针, 那么编译器就用这一套代码
不是指针就用最上面的代码
回到这里, 这里它是指针, 至于这个指针指向什么, 都可以
注意, 这里 T 只是一个符号, 上面的 T 和下面的 T 并不冲突
实在不行可以换成别的东西 :
//特化
template<typename U>
class C<U*>
{
//...
};
所以你作为设计者写出上面的泛化和特化的时候, 当使用者想下面这么用的时候
C<string> obj1;
C<string*> obj2;
所以编译器看到第一行代码的时候, 编译器就去用泛化的代码; 看到第二行代码, 第二行代码里面那个是指针, 所以编译器就去用上面的特化代码
这一种偏特化我们叫作范围上的偏
什么样的范围呢, 本来是任意范围, 现在是缩小到了指针