局部模板特化

 ***********************************************
 *    模板局部特化
 *
 *          首先要声明的是,C++还不支持对函数模板的局部特化,
 *    所以此处我们只讨论类模板的局部特化.
 *          我们依然首先需要一个主模板.(参考类模板显式特化) 
 *    自我理解:
 *          如果针对不能的指针定义不同的完全特化,岂不是太麻
 *    烦了,有没有更好的办法呢?那就是局部特化了.(例1)
 *    提示:
 *         局部特化它是一个模板.完全特化不是一样模板.
**********************************************
*/
//例1
/***********************************************
 *    局部特化  
 *          和完全特化不同,这里的Heap参数类型只是被部分的确
 *    定为T*,而T是一个未指定的类型,这就是为什么说它是局部
 *    特化的原因;
 *          当使用一个未经任何修饰的指针类型来实例化Heap时,
 *    局部特化将优先于主模板;
 *          当使用const char * 或 char *(参考类模板显式特化)来
 *    实例化Heap时,此时完全特化又会优先于局部特化.
 *    Heap<std::string> h1;    主模板    T是std::string
 *    Heap<std::string *> h2;    局部特化    T是std:string
 *    Heap<int **> h3;        局部特化 T是int *
 *    Heap<char *> h4;    完全特化 T是char *
 *    Heap<const int *> h5;    局部特化 T是const int
 *    Heap<int (*)()> h6;    局部特化 T是int()
**********************************************
*/

template 
<typename T>
class Heap<*> //注意这里
{
private:
    std::vector
<*>h_;
public:
    
void push(const T *val);
    T 
*pop();
    
bool empty()
    
{
        
return h_.empty();
    }

}
;

template 
<typename T>
void Heap<*>::push(const T *val)
{
    
//......
}


//例2
/***********************************************
 *          有一点很微妙但很有用:主模板的完全特化或局部特化
 *    必须采用与主模板相同数量和类型的实参进行实例化,但它
 *    的模板的参数并不需要具有和主模板相同的形式.
**********************************************
*/

//定义一个模板,有三个模板参数,书写形式如下
template <typename R,typename A1,typename A2> 
//注意,局部特化中,模板参数也是三个,但书写形式可不一样喽
class Heap<R (*) (A1,A2)>
{
    
//......
}
;

Heap
<char *(*) (int,int)> h7; //R是char *,A1和A2是int
//把 char *(*) (int,int) 想象成一个"指向有两个参数的非成员函数的指针"

template 
<class C,typename T>
class Heap<T C::*>
{
    
//......
}
;
Heap
<std::string Name::*> h8;//T是string,C是Name

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值