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
并依赖它。