说起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、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明!