有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只是我现有类的占位符。
答案 0 :(得分:-1)
如果foo
是模板函数,则必须在模板参数列表中的A之前定义B.调用foo
时,您还必须专门键入B.
如果您的代码是按原样提供的,那么您必须使foo
成为模板,其中A是模板的参数。
示例:
#include <memory>
template <typename B>
void doSomething(std::shared_ptr<B> &ptr)
{
}
template <typename B, typename A>
void foo(const std::shared_ptr<A> & ptr) {
if (std::is_base_of<B, decltype(*ptr)>::value) {
doSomething(std::static_pointer_cast<B>(ptr));
}
}
class A { };
class B : public A { };
int _tmain(int argc, _TCHAR* argv[])
{
std::shared_ptr<A> a(new B);
foo<B>(a);
return 0;
}