这个问题在这里已有答案:
假设我正在编写以下模板化函数:
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 ++ 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`函数,或者使用模板参数等。