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不是一个模板。它看起来像模板它是一个模板。很抱歉没有说清楚。