首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >警察和RTTI

警察和RTTI
EN

Stack Overflow用户
提问于 2014-05-29 09:42:14
回答 2查看 2.5K关注 0票数 4

我想做这样的事情:

代码语言:javascript
复制
template <typename T>
constexpr ::std::size_t type_name_hash()
{
  return ::std::hash<::std::string>()(typeid(T).name());
}

现在,我知道hashstring都不是constexpr,但这是可以解决的,假设它们是constexpr。我想问的是,如果打开了RTTI,计算typeid(T).name()哈希的constexpr函数是否还会产生编译时常量?当RTTI被关闭时怎么样?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-29 09:46:14

您认为运行时类型识别的哪一部分在编译时有效?常量表达式的规则不允许:

-一个typeid表达式(5.2.8),其操作数为多态类类型的极值;

所以你的模板只适用于某些类型。

RTTI关闭后,您就根本不能使用typeid了。

C++11已经提供了一种散列类型的机制:

代码语言:javascript
复制
return ::std::hash<::std::type_index>()(::std::type_index(typeid(T)));

但它并不是所有类型的常量表达式。

您可以使用指向每种类型的指针的type_index,因为指针不是多态类类型,仍然会提供唯一的类型:

代码语言:javascript
复制
return ::std::hash<::std::type_index>()(::std::type_index(typeid(T*)));

现在的问题是“只”type_index构造函数不是constexpr,哈希函数也不是。

票数 4
EN

Stack Overflow用户

发布于 2015-03-26 20:30:21

type id(type-id)和type id(Expr)都可以在常量表达式中使用,除非expr的结果是多态类类型的glvalue。

但是,由于type_info的标准成员中没有一个是constexpr (包括hash_code()方法),所以除了获取该对象的地址之外,您不能对该对象做任何事情。在标准中甚至没有对对象进行初始化的保证。而且即使使用该地址也几乎没有什么用处,因为不能保证type ()在与同一类型一起使用时具有相同的结果。例如,下面的断言可能失败:

代码语言:javascript
复制
static_assert(&typeid(int) == &typeid(int), "Multiple type_infos for int");

这是一个精心设计的示例,但并非闻所未闻的是,在一个程序中使用的多个共享库中,甚至在不同的翻译单元中,typeid(T)对相同的T产生不同的结果。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23930319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档