【发布时间】:2014-11-07 05:52:27
【问题描述】:
标准是否规定std::type_index(typeid(obj)) 的调用对于该类型是唯一的?我找不到这方面的信息。从type_info::name() 我得到了这个:
返回一个实现定义的以空字符结尾的字符串 包含类型的名称。不提供任何保证,在 特别是,对于几种类型,返回的字符串可以是相同的,并且 在同一程序的调用之间进行更改。
(来源:http://en.cppreference.com/w/cpp/types/type_info/name)
这让我相信,也许错位的名称/类型 ID 不一定是唯一的。然而,std::type_index 的页面专门使用了假设,即这些类型在其“usage example”中是唯一的。
那么我如何知道我的编译器的typeid 是否唯一,以及发生冲突的可能性有多大?此外,有没有办法获得某种我们可以知道对类型唯一的标识符(无论是字符串还是其他)?
Demangling 不是一个选项,因为它对于非常大的类型来说太慢了,但我的猜测是,如果实现提供了一个对名称进行 demangle 的工具,那么 mangled 名称应该是唯一的无论如何都要输入那个实现,对吗?
【问题讨论】:
-
@0x499602D2 好的,我想我有点糊涂了,我试着让它更清楚。
-
你可能想看看 Boost.TypeIndex -- 我没有亲自使用过,但文档说它即使在禁用 RTTI 的情况下也能工作
-
type_info有什么问题?这些名称不是正确的排序方式,它们有==和before。而且type_index从来没有提到name是吗? -
@Yakk 据我所知,
type_info不能在哈希映射中使用,而且我找不到任何表明type_index是独一无二的。 -
type_index使用底层before()的operator==()和before(),保证能正确进行比较。