【发布时间】:2015-03-26 19:50:17
【问题描述】:
有is_base_of来检查A类是否是B的基类。但是如果我没有变量的类型怎么办?
假设我有五个类 A、B、C、D 和 E,并且 D 和 E 分别从 A 和 B 派生。 C 仅从 A 派生。现在我有一个指向 A 的指针,我想知道是否可以将指针强制转换为 B。在这种情况下,我想知道我的 A 指针是指向 D 还是 E 对象,以便我可以将指针强制转换为 B 对象。
我尝试了以下方法,但没有成功。
void foo(const std::shared_ptr<A> & ptr) {
if (std::is_base_of<B, decltype(*ptr)>::value) {
doSomething(std::static_pointer_cast<B>(ptr));
}
}
编辑:foo 不是模板函数,A 和 B 只是我现有类的占位符。
【问题讨论】:
-
缩小范围,使用
dynamic_cast。它会为您检查(将抛出std::bad_cast) -
@RedAlert 没错!前提是至少有一个虚函数。
-
好吧,
std::dynamic_pointer_cast,它将返回一个空指针,而不是std::bad_cast,以防万一它不起作用。但是,是的,这需要运行时检查。 -
dynamic_cast也适用于指针,并在失败时返回 null。只有在转换引用时才会抛出std::bad_cast,因为引用不能为空。 -
@Wintermute:谢谢,std::dynamic_pointer_cast 有效!
标签: c++ c++14 typetraits