当前位置:主页   - 电脑 - 程序设计 - C/C++
C++的模板及模板特化
来源:网络   作者:   更新时间:2012-02-14
收藏此页】    【字号    】    【打印】    【关闭

  说起C++的模板及模板特化,相信很多人都很熟悉,但是说到模板特化的几种类型,相信了解的人就不是很多。我这里归纳了模板特化的几种类型,一是特化为绝对类型;而是特化为引用,指针类型;三是特化为另外一个模板类。

  这里用一个简单的例子来说明这三种情况:

//generalversion
template<classT>
classCompare
{
public:
  staticboolIsEqual(constT&lh,constT&rh)
  {
    returnlh==rh;
  }
};

  这是一个用于比较的模板类,里面可以有多种用于比较的函数,以IsEqual为例。

  一、特化为绝对类型

  也就是说直接为某个特定类型做特化,这是我们最常见的一种特化方式,如特化为float,double等

//specializeforfloat
template<>
classCompare<float>
{
public:
  staticboolIsEqual(constfloat&lh,constfloat&rh)
  {
    returnabs(lh-rh)<10e-3;
  }
};
//specializefordouble
template<>
classCompare<double>
{
public:
  staticboolIsEqual(constdouble&lh,constdouble&rh)
  {
    returnabs(lh-rh)<10e-6;
  }
};

  二、特化为引用,指针类型

  这种特化我最初是在stl源码的的iterator_traits特化中发现的,如下:

template<class_Iterator>
structiterator_traits{
 typedeftypename_Iterator::iterator_categoryiterator_category;
 typedeftypename_Iterator::value_type    value_type;
 typedeftypename_Iterator::difference_type difference_type;
 typedeftypename_Iterator::pointer     pointer;
 typedeftypename_Iterator::reference    reference;
};
//specializefor_Tp*
template<class_Tp>
structiterator_traits<_Tp*>{
 typedefrandom_access_iterator_tagiterator_category;
 typedef_Tp            value_type;
 typedefptrdiff_t         difference_type; [Page]
 typedef_Tp*            pointer;
 typedef_Tp&            reference;
};
//specializeforconst_Tp*
template<class_Tp>
structiterator_traits<const_Tp*>{
 typedefrandom_access_iterator_tagiterator_category;
 typedef_Tp            value_type;
 typedefptrdiff_t         difference_type;
 typedefconst_Tp*         pointer;
 typedefconst_Tp&         reference;
};

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明