C++类模板的三种特化

 时间:2026-02-12 19:55:40

1、特化为绝对类型

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

// specialize for floattemplate<>class Compare<float>{public:  static bool IsEqual(const float& lh, const float& rh)  {      return abs(lh - rh) < 10e-3;  }};// specialize for doubletemplate<>class Compare<double>{public:  static bool IsEqual(const double& lh, const double& rh)  {      return abs(lh - rh) < 10e-6;  }};

C++类模板的三种特化

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

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

template <class _Iterator>


struct iterator_traits {
typedef typename _Iterator::iterator_category iterator_category;
typedef typename _Iterator::value_type        value_type;
typedef typename _Iterator::difference_type   difference_type;
typedef typename _Iterator::pointer           pointer;
typedef typename _Iterator::reference         reference;
};

C++类模板的三种特化

3、特化为另外一个模板类

这其实是第二种方式的扩展,其实也是对类型做了某种限定,而不是绝对化为某个具体类型,如下:

// specialize for vector<T>template<class T>class Compare<vector<T> >{public:   static bool IsEqual(const vector<T>& lh, const vector<T>& rh)   {       if(lh.size() != rh.size()) return false;       else       {           for(int i = 0; i < lh.size(); ++i)           {               if(lh[i] != rh[i]) return false;           }       }       return true;

   }

};

这就把IsEqual的参数限定为一种vector类型,但具体是vector<int>还是vector<float>,我们可以不关心,因为对于这两种类型,我们的处理方式是一样的,我们可以把这种方式称为“半特化”。

  • 如何利用z-blog搭建网站
  • jxls2教程(一): 简单使用jxls2.X 导出excel
  • 可乐鸡翅怎么做
  • html分页自适应居中;css设置分页自适应居中
  • 智能电网输电线路在线监测系统YKJ
  • 热门搜索
    英语手抄报的英文 教师节手抄报大全 长征手抄报图片 手抄报怎么做 三爱手抄报图片 迎国庆的手抄报 小手牵大手手抄报 五一手抄报资料 中秋节手抄报资料 中秋佳节手抄报