假设我正在编写以下模板函数:
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-这个问题肯定已经存在,但是我找不到,所以我写下来。
答案 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>