dynamic_cast没有按预期抛出异常

时间:2014-09-20 19:23:22

标签: c++ dynamic-cast

基于这个答案...

  

Finding the type of an object in C++

...我写了这段代码:

        static TVALUE getUpperBound()
        {
            SomeStruct<TVALUE>* t;

            try
            {
                dynamic_cast<SomeStruct<bool>*> (t);
                return 1;
            }
            catch (int e)
            {
            }

            try
            {
                dynamic_cast<SomeStruct<unsigned char>*> (t);
                return 255;
            }
            catch (int e)
            {
            }

            try
            {
                dynamic_cast<SomeStruct<unsigned int>*> (t);
                return 65535;
            }
            catch (int e)
            {
            }

            return 0;
        }

但它不起作用: - /

我知道还有其他方法可以做到这一点(使用包含),但我需要让这项技术有效。

我不能在我的代码中包含任何包含内容(这是一个很长的故事,但我根本无法做到)...因此,这种尝试可以轻松完成使用climits或typeinfo。

有人可以向我解释为什么这不起作用吗?

编辑1:

谢谢你们。我错过了引用vs指针位。

现在可以使用:

template <typename TVALUE>
TVALUE getUpperBound()
{
    SomeStruct<TVALUE>* t;

    if (dynamic_cast<SomeStruct<bool>*> (t) != nullptr)
        return 1;
    if (dynamic_cast<SomeStruct<unsigned char>*> (t) != nullptr)
        return 255;
    if (dynamic_cast<SomeStruct<unsigned int>*> (t) != nullptr)
        return 65535;

    return 0;
}

编辑2:

我尝试了@StilesCrisis建议并使用了模板专业化

template <typename TVALUE>
TVALUE getUpperBound();

template <>
bool getUpperBound<bool>()
{
    return 1;
}

template <>
unsigned char getUpperBound<unsigned char>()
{
    return 255;
}

template <>
unsigned int getUpperBound<unsigned int>()
{
    return 65535;
}

有魅力。更好的实施。谢谢!

2 个答案:

答案 0 :(得分:4)

如果

dynamic_cast的模板参数是引用类型,则它仅在失败时抛出异常 当它是指针类型时,dynamic_cast会在失败时评估为NULL

这在the preferred language reference中非常明确,您只需使用Google搜索:

  

5c)否则,运行时检查失败。如果在指针上使用dynamic_cast,则返回类型为_new_type_的空指针值。如果它在引用上使用,则抛出异常std::bad_cast

我也不明白为什么你会期望抛出int,而不是推导std::exception。也许您希望return块中的try跳转到匹配的catch块?它没有。

答案 1 :(得分:1)

你正在施放指针。 bad_cast仅在转换为引用时生成。

如果推荐参考资料并不合适,您可以检查nullptr