C++-必知必会_类模板显式特化(条款46)

/***********************************************
 * 类模板显式特化(explicit specialization)
 * 
 *       为了进行特化,首先需要一个通用的版本,称主模板.
 *          主模板使用了标准库堆算法.  堆 是一种线性化的树形
 *    结构,    将一个值压入一个堆中, 实际上等于将该值插入到一
 *    个树形结构中;将一个值从堆中取出就等于移除并返回堆中
 *    最大值.
 *          但在处理字符的指针时会碰钉子.堆将按照指针的值进
 *    行组织. 我们可以提供一个显式特化版本解决此问题(例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();
}
;
 

你可能感兴趣的:(C++,算法,vector,Class,编译器)