dynamic_cast派生模板到较少cv限定的指针

时间:2016-04-25 19:59:15

标签: c++ c++11

我已获得以下代码:

struct Base
{
    virtual ~Base(){};
};

template<class T>
struct Derived : public Base
{};

int main()
{
    Derived<int> d;
    Base *pD = &d;

    if(dynamic_cast<Derived<const int>*>(pD))
    {
        std::cout << "const" << std::endl;
    }

    if(dynamic_cast<Derived<int>*>(pD))
    {
        std::cout << "non-const" << std::endl;
    }
}

我希望两个dynamic_cast都返回一个有效的指针,因为新类型的cv资格较少。任何人都可以向我解释我失踪的是什么吗?有没有办法在给定Derived<XYZ>指针的情况下识别Base忽略cv限定符?

2 个答案:

答案 0 :(得分:3)

从编译器的角度来看,Derived<int>Derived<const int>const char*struct MyBox相距甚远。换句话说,他们之间没有任何关系。

答案 1 :(得分:3)

您会混淆编译器正在查看的类型。 less const 指的是类型而不是模板参数。如果你有

if(dynamic_cast<const Derived<int>*>(pD))
{
    std::cout << "const" << std::endl;
}

if(dynamic_cast<Derived<int>*>(pD))
{
    std::cout << "non-const" << std::endl;
}

然后两个输出都会打印出来。

something<sometype>是完全不同的类型,然后是something<some_other_type>,但const something<sometype>只是const

something<sometype>版本