C++ 动态\u强制转换未按预期引发异常

C++ 动态\u强制转换未按预期引发异常,c++,dynamic-cast,C++,Dynamic Cast,根据这个答案 …我写了这段代码: static TVALUE getUpperBound() { SomeStruct<TVALUE>* t; try { dynamic_cast<SomeStruct<bool>*> (t); return 1; }

根据这个答案

…我写了这段代码:

        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;
        }
静态TVALUE getUpperBound()
{
SomeStruct*t;
尝试
{
动态铸型(t);
返回1;
}
捕获(INTE)
{
}
尝试
{
动态铸型(t);
返回255;
}
捕获(INTE)
{
}
尝试
{
动态铸型(t);
返回65535;
}
捕获(INTE)
{
}
返回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;
}
模板
TVALUE getUpperBound()
{
SomeStruct*t;
如果(动态_cast(t)!=nullptr)
返回1;
如果(动态_cast(t)!=nullptr)
返回255;
如果(动态_cast(t)!=nullptr)
返回65535;
返回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;
}
模板
TVALUE getUpperBound();
模板
bool getUpperBound()
{
返回1;
}
模板
unsigned char getUpperBound()
{
返回255;
}
模板
unsigned int getUpperBound()
{
返回65535;
}

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

dynamic\u cast
仅当其模板参数是引用类型时才会在失败时抛出异常。
当它是指针类型时,
dynamic_cast
在失败时计算为
NULL

这一点在中非常清楚,你可以简单地用谷歌搜索:

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


我也不明白为什么您希望抛出
int
,而不是派生
std::exception
的东西。也许您希望
try
块中的
return
跳转到匹配的
catch
块?它不会。如果其模板参数是引用类型,则仅在失败时抛出异常。
当它是指针类型时,
dynamic_cast
在失败时计算为
NULL

这一点在中非常清楚,你可以简单地用谷歌搜索:

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


我也不明白为什么您希望抛出
int
,而不是派生
std::exception
的东西。也许您希望
try
块中的
return
跳转到匹配的
catch
块?它没有。你正在向一个指针施法<代码>坏_转换仅在转换到引用时生成


如果不需要强制转换到引用,您可以只检查
nullptr

您正在对指针进行强制转换<代码>坏_转换仅在转换到引用时生成


如果不需要强制转换到引用,您可以只检查
nullptr

当您将使用cast-to-reference类型,但您使用的是指针时,这将抛出一个exeption。阅读文档carefully@user2451677:你为什么把答案写成评论?我没有时间写更详细的答案你的示例代码作为模板会更好。更便宜,同样有表现力。你能解释一下吗?当你使用cast-to-reference类型时,这会抛出一个exeption,但你使用的是指针。阅读文档carefully@user2451677:你为什么把答案写成评论?我没有时间写更详细的答案你的示例代码作为模板会更好。更便宜,同样有表现力。你能解释一下吗?dynamic_cast不是一个模板。它看起来像模板它是一个模板。很抱歉没有说得更清楚。dynamic_cast不是一个模板。它看起来像模板它是一个模板。很抱歉没有说清楚。