如何检查类是否继承了另一个类? [重复]

问题描述 投票:0回答:1

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

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 - 肯定已经有了这个问题,但我找不到一个所以我写了。

c++ c++11 subclass typetraits
1个回答
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)inconstexpr`函数,或者使用模板参数等。

© www.soinside.com 2019 - 2024. All rights reserved.