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

本文介绍了一个C++模板元编程示例,用于检查一种类型是否可以通过类型转换派生于另一种类型。通过定义`Conversion`类和宏`SUPPERSUBCLASS`来实现这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值