我想做这样的事情:
template <typename T>
constexpr ::std::size_t type_name_hash()
{
return ::std::hash<::std::string>()(typeid(T).name());
}现在,我知道hash和string都不是constexpr,但这是可以解决的,假设它们是constexpr。我想问的是,如果打开了RTTI,计算typeid(T).name()哈希的constexpr函数是否还会产生编译时常量?当RTTI被关闭时怎么样?
发布于 2014-05-29 09:46:14
您认为运行时类型识别的哪一部分在编译时有效?常量表达式的规则不允许:
-一个
typeid表达式(5.2.8),其操作数为多态类类型的极值;
所以你的模板只适用于某些类型。
RTTI关闭后,您就根本不能使用typeid了。
C++11已经提供了一种散列类型的机制:
return ::std::hash<::std::type_index>()(::std::type_index(typeid(T)));但它并不是所有类型的常量表达式。
您可以使用指向每种类型的指针的type_index,因为指针不是多态类类型,仍然会提供唯一的类型:
return ::std::hash<::std::type_index>()(::std::type_index(typeid(T*)));现在的问题是“只”type_index构造函数不是constexpr,哈希函数也不是。
发布于 2015-03-26 20:30:21
type id(type-id)和type id(Expr)都可以在常量表达式中使用,除非expr的结果是多态类类型的glvalue。
但是,由于type_info的标准成员中没有一个是constexpr (包括hash_code()方法),所以除了获取该对象的地址之外,您不能对该对象做任何事情。在标准中甚至没有对对象进行初始化的保证。而且即使使用该地址也几乎没有什么用处,因为不能保证type ()在与同一类型一起使用时具有相同的结果。例如,下面的断言可能失败:
static_assert(&typeid(int) == &typeid(int), "Multiple type_infos for int");这是一个精心设计的示例,但并非闻所未闻的是,在一个程序中使用的多个共享库中,甚至在不同的翻译单元中,typeid(T)对相同的T产生不同的结果。
https://stackoverflow.com/questions/23930319
复制相似问题