如何检查一个类是否继承另一个类?

时间:2019-04-20 18:48:48

标签: c++ c++11 subclass typetraits

假设我正在编写以下模板函数:

class A { /* ... */ };

// ... etc...

template<typename C>
void foo() {
    bool C_inherits_A = /* magic */;
    if (C_inherits_A) { do_something(); }        
    else { do_something_else(); }
}

我们记得从前的dynamic_cast,但这在这里是无关紧要的,因为没有指针,我正在检查“向下”,而不是“向上”。上面的代码段中有简单的替换/* magic */的东西吗?

PS-这个问题肯定已经存在,但是我找不到,所以我写下来。

1 个答案:

答案 0 :(得分:3)

从C ++ 11开始,标准的C ++库满足了这种确切的需求-使用std::is_base_of类型特征。要了解有关类型特征的更多信息,请参见它们的SO tag page

无论如何,您将/* magic */替换为:

std::is_base_of<A, C>::value

这是一个布尔表达式,如果A是C的基类,即C继承A,则为true。

请记住,类型特征是在编译时求值的,因此可以使用if(std :: is_base_of :: value)in constexpr`函数或模板参数等。 / p>