检查变量是否属于具有特定基类的类

时间:2015-03-26 19:50:17

标签: c++ c++14 typetraits

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只是我现有类的占位符。

1 个答案:

答案 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;
}