C++针对一个类的子类进行特化

转载 2012年03月22日 09:56:05

在水木C++版,有人提出如何针对"基类是xx类的类型"进行特化。这里面的关键
  是理解这样几件事情:
  
  1. 模板的特化
  2. 如何在编译期判断xx是xx的基类

  
  我们使用了这样一个type traits:


 1 
 2   template <typename B, typename D>
 3   struct is_base_of // check if B is a base of D
 4   {
 5      typedef char yes[1];
 6      typedef char no[2];
 7   
 8      static yes& test(B*);
 9      static no& test();
10   
11      static D* get(void);
12   
13      static const bool value = sizeof(test(get())) == sizeof(yes);
14   };
15 
  
  关键是理解struct is_base_of的最后一行,涉及对sizeof的理解:
  

 

The sizeof operator yields the number of bytes in the object 
representation of its operand. The operand is either an expression,
which is an unevaluated operand (Clause 5), or a parenthesized
type-id.
--- Working Draft, Standard for Programming Language C++ (5.3.3)

 


  重点就是test(get())是unevaluated,编译期可以推断出该表达式的类型,如果
  D是B的子类,则`static yes& test(B*);`是更好的匹配,否则就是另一个,而
  它们返回值类型的大小不一样,藉此可以判断D是否B的子类。

  
  下面是模板类的代码:


 1 
 2   struct    Base
 3   {
 4   };
 5   
 6   template <typename T, bool nouse=is_base_of<Base, T>::value>
 7   class ATemplate
 8   {
 9   public:
10      ATemplate(  )
11      {
12         printf( "no\n" );
13      }
14      ~ATemplate(  )
15      {
16   
17      }
18   };
19   
20   
21   template <typename T>
22   class ATemplate<T,true>
23   {
24   public:
25      ATemplate(  )
26      {
27         printf( "yes\n" );
28      }
29      ~ATemplate(  )
30      {
31   
32      }
33   };
34   
35   struct D:public Base
36   {
37   
38   };
39   struct C
40   {
41   
42   };
43   
44   
45   int main(  )
46   {
47      ATemplate<C>  t;
48      ATemplate<D> t1;
49      return 0;
50   }
51 
  
  结果如下:



  $ ./t
  no
  yes

C++针对一个类的子类进行的特化

C++针对一个类的子类进行的特化 Table of Contents 1 针对某个类的子类进行特化 1.1 模板的特化 1.2 判断一个类是否是xxx类的子类 1.3 参考 ...
  • LittleGrizzly
  • LittleGrizzly
  • 2012年04月23日 19:01
  • 873

c++学习(模板特化和偏特化)

模板特化和偏特化作者:谢宝陵  周 生(合肥市炮兵学院计算中心 230031)摘要:本文通过例子介绍了在 C++标准库中广泛使用的模板特化和偏特化,并指出了模板特化和偏特化的定义规则和应用规则。关键词...
  • zhang810413
  • zhang810413
  • 2007年12月18日 22:26
  • 12181

C++11:如何判断一个类是另一个模板类的子类?

我有一个模板类memory_cl,我需要判断另一个类是否为它的子类,怎么实现呢? 开始我问了度娘,在知乎上找到了答案 —>《如何判断一个类是否为一个模板类的实例?》 上面这个链接中给出了完整的答案...
  • 10km
  • 10km
  • 2016年03月10日 12:45
  • 1576

【面试题】如何判断一个类是不是另一个的子类

听到这个题的时候我想到了当时的强制转化中有一种转换可以将父类指针转换为子类指针,我就试了以下,可以的,下面先简单介绍这种转换 dynamic_cast用于将一个父类对象的指针转换为子类对象的指针或引...
  • shangguan_1234
  • shangguan_1234
  • 2016年10月16日 15:41
  • 573

C++类模板的三种特化

C++类模板的三种特化 By SmartPtr(http://www.cppblog.com/SmartPtr/)  说起C++的模板及模板特化, 相信很多人都很熟悉 ,但是说到模板特化的几种类型,相...
  • kybd2006
  • kybd2006
  • 2007年11月08日 15:39
  • 9940

C++ 模板全特化中的函数特化

#include using namespace std; template bool isLess(T x, T y) { cout
  • u011676589
  • u011676589
  • 2013年11月13日 17:09
  • 1254

C++模板的特化详解(函数模版特殊,类模版特化)

参照 小解C++模板特化 C++模板的特化 模板的全特化与偏特化 模版与特化的概念函数模版与类模版C++中模板分为函数模板和类模板 函数模板:是一种抽象函数定义,它代表一...
  • gatieme
  • gatieme
  • 2016年03月22日 14:40
  • 8920

C++ 模板全特化和偏特化

1. 模板特化按对象类型(类和全局函数)分为两种: 类模板的特化和 全局模板函数的特化; 2. 按特化的类型分全特化和偏特化(也就是多个模板参数可以选定只 特化一个或者多个),全局模板函数的特化不支持...
  • hzhxxx
  • hzhxxx
  • 2015年12月03日 09:30
  • 2249

C++ — 全特化和偏特化

全特化和偏特化
  • Dawn_sf
  • Dawn_sf
  • 2017年05月04日 16:31
  • 1124

sizeof 可变参数的模版特化 C++ templa

1 sizeof 测量函数返回值大小的时候,是不执行函数的 2 可变参数列表可以没有一个参数,只是不能用参数了(这句不知到对不对) 3 可变参数列表再模版实例化过程中比较弱; #inc...
  • qq_22821311
  • qq_22821311
  • 2016年08月25日 20:18
  • 393
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++针对一个类的子类进行特化
举报原因:
原因补充:

(最多只允许输入30个字)