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 参考 ...

在VC6里把偏特化后的模板类(或者整个模板类族)声明为另一个类的友元的方法

/******************************************************************** file name : CLK.h author ...

动态实例化一个类以及一个类的子类(C++/JAVA)

整理一下理解的几种模式的类的实例化: Singleton:单态,这个类只能被实例化一次 Factory Method:在Factory子类里,进行,product类的子类的实例化(Simple F...
  • xkarl
  • xkarl
  • 2011年11月29日 22:45
  • 863

C++类模板的三种特化

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

C++ 类模版 特化

C++类模板的三种特化 By SmartPtr(http://www.cppblog.com/SmartPtr/)     说起C++的模板及模板特化, 相信很多人都很熟悉 ,但是说...

C++ 的嵌套类模板的特化定义不允许写在类定义的范围内

最近在使用在使用模板特化写一段程序时发现一个奇怪的问题,比如像如下代码:   #include using namespace std; class CMyClass ...

【C++泛型编程】模板偏特化、局部类和型别映射(Int2Type,Type2Type)以及型别选择

1.模板偏特化          模板偏特化是让你在template的所有可能实体中特化出一组子集。 下面是一个模板全特化的例子,假设有一个类模板,名为Widget: template class W...

C++:函数模板、类模板及其特化

模板分为函数模板和类模板。下面我们先来介绍函数模板. 1,函数模板:该函数与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型。 我们距离来说明函数模板的具体用法。 定义一个实现加法功能...

c++类模板与函数模板的偏特化

(1) 类模板的偏特化 例如c++标准库中的类vector的定义 template class vector { // … // }; template class vector { /...

C++超基础:类模板——下、类模版的特化

一、类的特化 1、编译器会自动优先选择特化的类模版 2、函数模版和类模版的模版参数也可以是普通数值 #include using namespace std; template class...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++针对一个类的子类进行特化
举报原因:
原因补充:

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