基于这个答案...
在 C++ 中查找对象的类型 https://stackoverflow.com/questions/351845/finding-the-type-of-an-object-in-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;
}
但它不起作用:-/
我知道还有其他方法可以做到这一点(使用包含),但我需要让这项技术发挥作用。
我不能在我的代码中包含任何包含内容(这是一个很长的故事,但我就是不能)...因此,我尝试做一些可以使用 climits 或 typeinfo 轻松完成的事情。
谁能向我解释一下为什么这不起作用?
Edit 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;
}
Edit 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
失败时。
这一点在首选语言参考 http://en.cppreference.com/w/cpp/language/dynamic_cast,你可以简单地用谷歌搜索一下:
5c) 否则,运行时检查失败。如果dynamic_cast
用于指针,返回 _new_type_ 类型的空指针值。如果它用于引用,则例外std::bad_cast
被抛出。
我也不明白为什么你期望int
被抛出,而不是派生的东西std::exception
。也许你希望return
in a try
块跳转到匹配的catch
堵塞?事实并非如此。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)