C++-必知必会_类模板成员特化(条款48)

本文探讨了类模板成员特化的概念及应用,强调特化时需重新实现主模板的所有功能,并通过具体示例展示了如何对特定类型的成员函数进行特化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*************************************************
 *    类模板成员特化
 *
 *          再提醒一下,虽然模板的特化和类的派生之间没有任何关
 *    系, 但在特化模板的时候,不妨借鉴一下派生的精神.也就意味
 *    着一个完全特化或局部特化通常必须重新实现 主模板具备的
 *    所有能力.
************************************************
*/

// 例1
// 主模板
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();
    }

}

// 其实我们真正需要特化的是 push 和 pop两个函数.
// 对比显式特化,它是通过主模板,再写一个模板显式特化版本类;
// 而这里只是对类模板成员进行了单独特化.
template <>
void  Heap < const   char *> ::push( const   char   * const   & pval)
{
    h_.push_back(pval);
    std::push_heap(h_.begin(),h_.end(),strLess);
}


template
<>
const   char *  Heap < const   char *> ::pop()
{
    std:pop_heap(h_.begin(),h_end(),strLess);
    
const char* tmp = h_.back();
    h_.pop_back();
    
return tmp;
}


/*************************************************
 *           注意,这些函数的接口必须和 "它们正在特化其成员" 的模
 *    板的相应接口相匹配.如例1, 就得和主模板的接口相匹配.而如
 *    果你是自己再定义的一个显式/局部特化版本类,就不需要匹配
 *    一致.(见显式特化和局部特化)
 *           最后指出两点: 首先,除了成员函数外,其实成员也可以被
 *    显式特化,如静态成员和成员模板.
 *           其次,显式特化是为模板或模板成员提供定制版本的一种
 *    手段;而显式实例化仅仅是明确地告诉编译器去实例化一个成
 *    员.        
************************************************
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值