dynamic_cast未按预期抛出异常

dynamic_cast not throwing exceptions as expected

本文关键字:抛出异常 cast dynamic      更新时间:2023-10-16

基于这个答案。。。

在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;
        }

但它不起作用:-/

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

我不能在代码中包含任何include(说来话长,但我根本不能)。。。因此,尝试做一些可以用climits或typeinfo轻松完成的事情

有人能向我解释一下为什么这不起作用吗?

编辑1:

谢谢大家。我错过了参考与指针的位置。

现在工作:

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

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

dynamic_cast只有在其模板参数为引用类型时才会在失败时抛出异常
当它是指针类型时,dynamic_cast在失败时计算为NULL

这在首选语言参考中非常清楚,你可以简单地在谷歌上搜索:

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

我也不明白为什么期望抛出int,而不是派生std::exception的东西。也许您希望try块中的return跳到匹配的catch块?事实并非如此。

您正在转换为指针。bad_cast仅在强制转换为引用时生成。

如果不希望转换为引用,您可以只检查nullptr