Conversion SUPPERSUBCLASS 判断 T 是否为 U 的父类

来源:互联网 发布:车辆识别软件 编辑:程序博客网 时间:2024/06/07 00:23

#include <cstdlib>
#include <iostream>

using namespace std;
template<class T,class U>
class Conversion
{
  typedef char small;
  class Big{char dummy[2];};
  static small Test(T);
  static Big Test(...);
  static T MakeT();
  static U MakeU();
public:
  enum{exists = sizeof(Test(MakeU())) == sizeof(small)};
  enum{exist2ways = exists && Conversion<U,T>::exists};
  enum{sametype = false};
};
template<class T>
class Conversion<T,T>
{public:enum{exists = 1,exist2ways = 1,sametype = 1};};
#define SUPPERSUBCLASS(T,U)/
        (Conversion<const T*,const U*>::exists)&&/
        !(Conversion<const T*,const void*>::sametype)//防止 T* 是void*类型
#define SUPPERSUBCLASS_STRICT(T,U)/
        (Conversion<const T,const U>::exists)&&/
        !(Conversion<const T,const void>::sametype)//防止 T* 是void*类型
class Base
{};
class Derived:public Base
{};
int main(int argc, char *argv[])
{
    cout<<"SUPPERSUBCLASS(T,U)结果 (1 = T是U的父类)(0 = T不是U的父类)"<<endl;
    cout<<"----------------------------------------------------"<<endl;
    bool bRes = SUPPERSUBCLASS(Base,Derived);
    cout<<"SUPPERSUBCLASS(Base,Derived)的关系:"<<bRes<<endl;
    bRes = SUPPERSUBCLASS(Derived,Base);
    cout<<"SUPPERSUBCLASS(Derived,Base)的关系:"<<bRes<<endl;
    bRes = SUPPERSUBCLASS(int,Base);
    cout<<"SUPPERSUBCLASS(int,Base)的关系:"<<bRes<<endl;
    bRes = SUPPERSUBCLASS(int,float);
    cout<<"SUPPERSUBCLASS(int,float)的关系:"<<bRes<<endl;
    bRes = SUPPERSUBCLASS(int,void);
    cout<<"SUPPERSUBCLASS(int,void)的关系:"<<bRes<<endl;
    bRes = SUPPERSUBCLASS(Derived,void);
    cout<<"SUPPERSUBCLASS(Derived,void)的关系:"<<bRes<<endl;
    bRes = SUPPERSUBCLASS(void,Derived);
    cout<<"SUPPERSUBCLASS(void,Derived)的关系:"<<bRes<<endl;
    cout<<"----------------------------------------------------"<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}