0

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

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 - 这个问题肯定已经被骗了,但我就是找不到,所以我把它写了出来。

4

1 回答 1

3

从 C++11 开始,标准 C++ 库就满足了这一确切需求——使用 std::is_base_of类型特征。要了解更多关于类型特征的信息,请参阅他们的SO 标签页

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

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

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

请记住,类型特征是在编译时评估的,因此您可以使用if(std::is_base_of::value) inconstexpr` 函数,或在模板参数中等等。

于 2019-04-20T18:48:47.537 回答