c++模板特化(2)

  • c++模板特化
    一、模板特化, specialization of template
    模板特化(specialization of template)并不是说实例化一个模板,如template <class T>,class stack<T>;声明stack<int>,这是实例化一个模板类。类模板特化的意思是,对于某个特定的类型,需要对模板进行特殊化,即特殊的处理。例如,stack类模板针对bool类型有特化,因为实际上bool类型只需要一个二进制位,就可以对其进行存储,使用一个字或者一个字节都是浪费存储空间的.同样,函数模板特化也是针对某个特定类型的特殊处理,一个比较经典的例子:
    template <class T>
    T mymax(const T t1, const T t2)
    {
        return t1 < t2 ? t2 : t1;
    }
    main()
    {
       int highest = mymax(5,10);//正确结果
       char c = mymax(‘a’, ’z’);//正确结果
       const char* p1 = “hello”;
       const char* p2 = “world”;
       const char* p = mymax(p1,p2);//错误结果,因为比较的是指针,而不是内容
    }
     
    如果需要得到正确结果就需要针对const char*的函数模板特化:
    const char* mymax(const char* t1,const char* t2)
    {
        return (strcmp(t1,t2) < 0) ? t2 : t1;
    }
     
    二、模板偏特化,partial specialization of template
    模板的偏特化是指需要根据模板的某些但不是全部的参数进行特化。
    1. 类模板的偏特化
    例如c++标准库中的类vector的定义
    template <class T, class Allocator>
    class vector { // … // };
    template <class Allocator>
    class vector<bool, Allocator> { //…//};
    这个偏特化的例子中,一个参数被绑定到bool类型,而另一个参数仍未绑定需要由用户指定。
     
    2. 函数模板偏特化
    严格的来说,函数模板并不支持偏特化,但由于可以对函数进行重载,所以可以达到类似于类模板偏特化的效果。
       template <class T> void f(T);   (a)
       根据重载规则,对(a)进行重载
       template <class T> void f(T*);   (b)
       如果将(a)称为基模板,那么(b)称为对基模板(a)的重载,而非对(a)的偏特化。C++的标准委员会仍在对下一个版本中是否允许函数模板的偏特化进行讨论。

    三、模板特化时的匹配规则
    (1) 类模板的匹配规则
    最优化的优于次特化的,即模板参数最精确匹配的具有最高的优先权
    例子:
    template <class T> class vector{//…//}; // (a)   普通型

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值