【问题标题】:How can I find out if std::type_index is unique for my compiler?如何确定 std::type_index 对于我的编译器是否是唯一的?
【发布时间】: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(),保证能正确进行比较。

标签: c++ c++11


【解决方案1】:

type_info 上的 name 函数不一定有用。实现可能会为所有内容返回 "" 并符合要求。在实践中它并不总是"",它可以用于调试,但仅此而已。

但是,type_info ==beforehash_code 不依赖于 name

type_index 是一个指向 type_info 的指针的包装器,它使用 info 的方法来生成 Regular 类型(可以复制、存储等)。对于不同的类型,它是不同的。


现在,在实践中,问题在于,在某些 C++ 平台上,两个不同的动态库具有完全相同的类型(但不是从一个导出)具有不同的type_info 但相同的.name()

可能希望它们具有相同的名称,或者您可能希望比较 type_infos。

两者都是问题。

【讨论】:

  • 但是哈希也没有保证,根据thistype_info 引用不同类型的对象可能具有相同的hash_code(尽管标准建议实现避免这种情况,因为尽可能)
  • @ricab 是的。所以你比较hash_code 是否提前退出,如果相等,请仔细检查==。或者只是做== 并假设实施质量。或者创建一个typeindex 并依赖它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2013-02-24
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
相关资源
最近更新 更多