检查哪个子类是父类对象

时间:2018-05-05 11:03:40

标签: c++ inheritance

我们有一个方法,它将一个类作为参数传递。这个类有不同的子类。我们需要知道哪些类是作为此方法的参数传递的类。由于赋值要求,我们无法为每个可能的类定义一个方法。此外,如果此方法不支持子类,则必须在编译时抛出错误。 我们一直在尝试使用static_cast来实现这一点,但我们无法获得所需的结果,因为始终可以在两个子类之间进行转换。

class A{
...
};

class B : public A{
...
};

class C : public A{
...
}

void foo(A a){
    if(a is B){
        //OK and do stuff
    }else if(a is C){
        //throw compile error
    }
}

1 个答案:

答案 0 :(得分:1)

您可以将foo本身作为模板编写,以便在编译时执行所有检查:

#include <type_traits>

template<class T>
void foo(T t)
{
  static_assert(std::is_same<T, C>::value == false,
                "foo() must not be invoked with object of class C");
  if (std::is_same<T, B>::value) {
    // do stuff
  }
}

static_assert用于某些条件的编译时检查,std::is_same在编译时比较两种类型。