设为首页 加入收藏

TOP

C++模板的特化(一)
2013-04-24 12:13:11 】 浏览:1135
Tags:模板

  对模板特化的理解:

  特化整体上分为全特化和偏特化,这一点大家都没有什么置疑,但是细分它们各包括哪几种状态就很难界定了,而且很多权威的书上都不一致,管它呢,反正我们能会用各种特化就可以了。

  下面就谈谈我个人对特化的划分和定义:

  所谓特化,就是将泛型的东东搞得具体化一些,从字面上来解释,就是为已有的模板参数进行一些使其特殊化的指定,使得以前不受任何约束的模板参数,或受到特定的修饰(例如const或者摇身一变成为了指针之类的东东,甚至是经过别的模板类包装之后的模板类型)或完全被指定了下来。

  这是网上某个人的一些看法:

  模板有两种特化,全特化和偏特化(局部特化)

  模板函数只能全特化,没有偏特化(以后可能有)。

  模板类是可以全特化和偏特化的。

  全特化,就是模板中模板参数全被指定为确定的类型。

  全特化也就是定义了一个全新的类型,全特化的类中的函数可以与模板类不一样。

  偏特化,就是模板中的模板参数没有被全部确定,需要编译器在编译时进行确定。

  在类型上加上const、&、*( cosnt int、int&、int*、等等)并没有产生新的类型。只是类型被修饰了。模板在编译时,可以得到这些修饰信息。

  我个人也比较赞同这位仁兄的划分,全特化的标志就是产生出完全确定的东西,而不是还需要在编译期间去搜寻适合的特化实现,貌似在我的这种理解下,全特化的东西不论是类还是函数都有这样的特点,template <>然后是完全和模板类型没有一点关系的类实现或者函数定义,如果你要说,都完全确定下来了,那还搞什么模板呀,直接定义不就完事了?但是很多时候,我们既需要一个模板能应对各种情形,又需要它对于某个特定的类型(比如bool)有着特别的处理,这中情形下就是需要的了。

  既然刚才提到了全特化的标志,那么再说说其他一些共性的东西:

  一个特化的模板类的标志:在定义类实现时加上了<>,比如class A<int, T>;而在定义一个模板类的时候,class A后面是没有<>的

  全特化的标志:template <>然后是完全和模板类型没有一点关系的类实现或者函数定义

  偏特化的标志:template <typename T……>,就是说还剩下点东西,不像全特化<>整得那么彻底

  首先推荐两个不错的网址:

  http://www.cnblogs.com/cutepig/archive/2009/02/12/1389479.html

  http://read.newbooks.com.cn/info/175115.html

  先说类模板的特化吧:

  谁都没的说的全特化:

  // general version

  template<class T>

  class Compare

  {

  public:

  static bool IsEqual(const T& lh, const T& rh)

  {

  return lh == rh;

  }

  };

  // specialize for float

  template<>

  class Compare<float>

  {

  public:

  static bool IsEqual(const float& lh, const float& rh)

  {

  return abs(lh - rh) < 10e-3;

  }

  };

  谁都没的说的偏特化:

  template<class T1, class T2>

  class A

  {

  }

  template<class T1>

  class A<T1, int>

  {

  }

  接下来的特化种类,到底划归到全特化还是偏特化,你自己看着办吧,不过大致就以下这些了,逃不出我们的手掌心了:

  特化为引用,指针类型:

  // specialize for T*

  template<class T>

  class Compare<T*>

  {

  public:

  static bool IsEqual(const T* lh, const T* rh)

  {

  return Compare<T>::IsEqual(*lh, *rh);

  }

  };

     

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Floyd(最短路径问题) 下一篇调试秘笈之运行时的错误

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目