#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;
}