dynamic_cast未按预期抛出异常
dynamic_cast not throwing exceptions as expected
基于这个答案。。。
在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
。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- 函数如何通知用户它基于函数原型抛出异常?
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- VisualStudios 会抛出异常,而代码块不会 [C++]
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- ZMQ::send() 抛出异常并终止 QNX 进程.为什么以及如何从中恢复?
- new(std::nothrow) int[n] 抛出异常
- 为什么g_object_set抛出异常(vcruntime140.dll)?
- 你能防止 std::regex 在无效表达式上抛出异常吗?
- C++子线程抛出异常
- 我们应该在抛出异常之前取消分配内存吗
- 有没有一种方法可以让OpenCLC++绑定为所有错误抛出异常
- 为什么访问模板化变体作为返回值抛出异常
- 如何实现,错误分配中止而不是抛出异常
- std::p riority_queue::p op什么时候会抛出异常
- 在0x5914F3BE抛出异常(基于.dll)
- std::vector 默认构造函数可以抛出异常吗?
- 挂钩创建文件抛出异常:读取访问冲突
- getaddrinfo 抛出异常
- 如果文件为c ,如何抛出异常