如何测试B类是否来自A类?

时间:2010-12-26 00:18:57

标签: c++ templates inheritance

更具体地说,假设我有一个带有参数AB的类模板,如果B不是源自,那么我希望编译错误(当模板被实例化时)甲

template<class A, class B>
class Foo
{
    // static_assert(B is derived from A)
};

3 个答案:

答案 0 :(得分:10)

之前已经问了很多次,但是这很简单我会再次发布解决方案:

~Foo()
{
    A* p = (B*)0; // B is required to be a subtype of A
}

答案 1 :(得分:9)

检查boost::is_base_of。如果您想自己尝试,请尝试使用this question中的Alexyey代码:

typedef char (&yes)[1];
typedef char (&no)[2];

template <typename B, typename D>
struct Host
{
  operator B*() const;
  operator D*();
};

template <typename B, typename D>
struct is_base_of
{
  template <typename T> 
  static yes check(D*, T);
  static no check(B*, int);

  static const bool value = sizeof(check(Host<B,D>(), int())) == sizeof(yes);
};

修改即可。编写静态断言并不是什么大问题,但这里是:

#define STATIC_ASSERT(expr, msg) \
  { stat_assert<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; } 

template<int>
struct stat_assert;

template<>
struct stat_assert<true>{};

Edit2。如果您不知道如何合并这些内容,那么整个工作:Code on ideone

答案 2 :(得分:0)

您想要的是使用SFINAE规则制作模板的方法,该模板会在通常首选的情况下生成错误,但也可以以其他方式扩展。我相信提升可能已经有了一个模板就可以做到这一点。

其他人给了你一些代码。我将离开这个答案,因为它解释了代码是如何工作的。