C++ 如何确定std::type_索引对于我的编译器是否是唯一的?
该标准是否规定调用C++ 如何确定std::type_索引对于我的编译器是否是唯一的?,c++,c++11,C++,C++11,该标准是否规定调用std::type_index(typeid(obj))对该类型是唯一的?我找不到这方面的信息。从键入\u info::name()我得到了以下信息: 返回实现定义的以null结尾的字符串 包含类型的名称。没有提供任何保证,以 特别是,对于几种类型和类型,返回的字符串可以相同 在同一程序的调用之间进行更改 (来源:) 这让我相信,可能损坏的名称/类型ID不一定是唯一的。然而,的页面特别使用了这样的假设,即这些类型在其“”中是唯一的 那么,我如何知道编译器的typeid是否唯一,
std::type_index(typeid(obj))
对该类型是唯一的?我找不到这方面的信息。从键入\u info::name()
我得到了以下信息:
返回实现定义的以null结尾的字符串
包含类型的名称。没有提供任何保证,以
特别是,对于几种类型和类型,返回的字符串可以相同
在同一程序的调用之间进行更改
(来源:)
这让我相信,可能损坏的名称/类型ID不一定是唯一的。然而,的页面特别使用了这样的假设,即这些类型在其“”中是唯一的
那么,我如何知道编译器的typeid
是否唯一,以及发生冲突的可能性是多少呢?此外,是否有任何方法可以获取某种类型的标识符(无论是字符串还是其他类型),我们可以知道这些标识符对于该类型是唯一的
Demangling不是一个选项,因为它对于非常大的类型来说太慢了,但我的猜测是,如果实现提供了一个工具来demangle一个名称,那么在该实现中,损坏的名称对于该类型来说应该是唯一的,正确吗?不保证
type\u info
上的name
函数有用。实现可能会返回所有内容的”
,并且是兼容的。实际上,它并不总是”
,它可以用于调试,但只能用于调试
但是,在
和之前键入信息
和散列代码
不依赖于名称
type\u index
是指向type\u info
的指针的包装,它使用info的方法生成常规类型(可以复制、存储等)。对于不同的类型,它是不同的
现在,在实践中,问题是,在一些C++平台上,两个不同的动态库(每个都是完全相同的类型)(但不是从一个导出)具有不同的<代码> Type信息> /Cord>,但相同的<代码>。 您可能希望这些名称相同,或者您可能希望比较类型信息
这两个都是问题。@0x499602D2好吧,我想我有点糊涂了,我已经试着把它说得更清楚了。你可能想看看Boost.TypeIndex——我没有亲自使用过它,但文档说它甚至可以与RTTI disabled一起使用。
type\u info
有什么问题?这些名称不是正确的排序方式,它们前面有=
和。而且type\u index
从来没有提到name
是吗?@Yakk据我所知type\u info
不能用在散列映射中,我也找不到任何东西表明type\u index
是唯一的。type\u index
使用底层type\u info的操作符==()
和before()
,可以保证正确执行比较。但是哈希也没有保证,根据:type\u info
引用不同类型的对象可能具有相同的哈希代码(尽管标准建议实现尽可能避免这种情况)@ricab Yes。因此,您可以比较hash_code
以提前退出,如果相等,请再次检查=
。或者只需执行==
并假定实现的质量。或者创建一个typeindex
并依赖它。