易采站长站为您分析C++编程中类模板的三种特化,需要的朋友可以参考下
1.类模板显式特化
为了进行特化,首先需要一个通用的版本,称主模板.主模板使用了标准库堆算法. 堆 是一种线性化的树形结构,将一个值压入一个堆中, 实际上等于将该值插入到一个树形结构中;将一个值从堆中取出就等于移除并返回堆中最大值.但在处理字符的指针时会碰钉子.堆将按照指针的值进行组织. 我们可以提供一个显式特化版本解决此问题(例1)如果希望除了一个针对const char*的Heap外,还希望提供一个针对char *的Heap;(例2)
//主模板
template <typename T>
class Heap
{
private:
std::vector<T> h_;
public:
void push(const T& val);
T pop();
bool empty() const //const声明在末尾表示该函数不能修改类变量
{
return h_.empty();
}
}
template <typename T>
void Heap<T>::push(const T& val)
{
h_.push_back(val);
std::push_heap(h_.begin(),h_.end());
}
template <typename T>
T Head<T>::pop()
{
std::pop_head(h_.begin(),h_.end());
T tmp(h_.back());
h_.pop_back();
return tmp;
}
例1
//显示特化版本
/***********************************************
* 可以看到模板参数列表是空的,其实这根本不是一个模
* 板. 因为没有指定任何模板参数.所以模板的显式特化又被
* 称作"完全特化".
* Heap<const char*> 完全特化,不会导致模板的实例化;
* Heap<int> 特化,会导致模板的实例化;
* 编译器根据主模板的声明来检查类模板特化.
***********************************************/
template<>//注意,无任何参数,当然,它本来就不是一个模板
class Head<const char *>
{
private:
std::vector<const char *> h_;
public:
void push(const char *pval);
const char * pop();
bool empty() const //const声明在末尾表示该函数不能修改类变量
{
return h_.empty();
}
};
//再次提醒, Head<const char *>不是一个模板
void Heap<const char*>::push(const char *pval)
{
h_.push_back(pval);
std::push_heap(h_.begin(),h_.end());
}
例2
/***********************************************
* C++没有要求显式特化的接口必须和主模板的接口完全
* 匹配.如该例中,没有定义主模板的empty函数,并且自行增加
* 了size和capitalize两个函数.
* 提醒:此例中不定义empty函数是不可取的,定义模板的
* 显式特化和类的派生之间虽然不存在任何技术上的联系,但
* 是用户依然可以参考类的派生的优点,让特化版本至少具有
* 主模板的基本能力.
***********************************************/
template<>//注意,无任何参数,当然,它本来就不是一个模板
class Head<char *>
{
private:
std::vector<char *> h_;
public:
void push(char *pval);
char * pop();
//注意,此处没有提供empty函数哟!!!
size_t size() const;
void capitalize();
};










