模版特例化

转自http://www.cppblog.com/shanoa/archive/2009/05/25/85683.html

 

写模版多了的人,必然会遇到这样那样的问题,模版特例化就是解决了一个经常碰见的问题:如果我们需要根据某些特殊的模版参数类型来重新实现一下算法的话,该怎么办呢?说的多了那也没什么用,我们就写一个会做除法的类吧。这个类在做整数除法的时候会同时求出余数,而在算其他类型时是不求的。代码如下:

 

 

#include <iostream>

 

template<typename Ty>

class Division

{

public:

    Division(Ty dividend, Ty divisor)

        :mDividend(dividend), mDivisor(divisor){}

public:

    void show()

    {

        std::cout<<"结果 = "<<mDividend/mDivisor<<std::endl;

    }

 

    Ty mDividend, mDivisor;

};

 

template<>

inline void Division<int>::show()

{

    std::cout<<"结果 = "<<mDividend/mDivisor<<std::endl;

    std::cout<<"余数 = "<<mDividend%mDivisor<<std::endl;

}

 

int _tmain(int argc, _TCHAR* argv[])

{

    Division<int> a(20, 11);

    a.show();

 

    Division<float> b(20.0f, 11.0f);

    b.show();

    return 0;

}

 

以上这种方式就叫做局部特化,关于全部特化和局部特化、全特化和偏特化,我认为他们之间的关系很紧密,界限也很模糊,硬要分类的话,以上面的Division类为例,就看下面的代码对全部特化和局部特化的区别吧:

/**

@remark

Division的全部特化

*/

template<>

class Division<int>

{

public:

     Division(Ty dividend, Ty divisor)

         :mDividend(dividend), mDivisor(divisor){}

public:

     void show()

     {

         std::cout<<"结果 = "<<mDividend/mDivisor<<std::endl;

         std::cout<<"余数 = "<<mDividend%mDivisor<<std::endl;

     }

 

     Ty mDividend, mDivisor;

};

 

/**

@remark

Division的局部特化

*/

template<>

inline void Division<int>::show()

{

     std::cout<<"结果 = "<<mDividend/mDivisor<<std::endl;

     std::cout<<"余数 = "<<mDividend%mDivisor<<std::endl;

}

上面的代码只是说明了全部特化和局部特化,并没有说明什么事全特化和偏特化。其实,对于只有一个参数的模版类型来说,并没有什么全特化和偏特化的区别,但如果是一个以上的模板参数,那就是由区别的了,如下:

/**

@remark

原始模板类

*/

template<typename Ty, typename TyEx>

class ObjectData

{

    //

};

 

/**

@remark

Object的全特化

*/

 

template<>

class ObjectData<int, float>

{

    //

};

 

/**

@remark

Object的偏特化,只特化第一个参数

*/

template<typename TyEx>

class ObjectData<int, TyEx>

{

    //

};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值