基于这个答案...
...我写了这段代码:
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;
}
有魅力。更好的实施。谢谢!
答案 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
。