C ++ 11中唯一类型识别的最安全方式

时间:2013-06-01 17:24:45

标签: c++ c++11 typeid

在新标准形成期间的某个地方,承诺更容易type_info使用,其中包括hash_code的实施。在C ++ 11中实现反射系统然而我又遇到了一个带有唯一类型识别的问题。

我需要:

  1. 允许我使用typeid从类型中提取唯一标识符的东西
  2. 唯一标识符需要能够在键/值容器中使用
  3. 标识符不需要是可移植的,程序执行之间也不一样,
  4. 请注意,我不需要在程序执行之间保持持久性。看起来似乎:

    1. .name()完全没用,因为标准不对它提供任何保证。
    2. .hash_code()也没用,因为它不能保证是唯一的
    3. 指向type_info对象的指针在任何地方都不起作用(例如,跨越DLL)
    4. 只有.before()似乎有用 - 虽然我不知道它是否会遇到与#3相同的问题
    5. 即使要使用.before(),我们也可以使用map,而我更愿意使用unordered_map

      struct compare_type_info {
          bool operator ()(const type_info* a, const type_info* b) const {
              return a->before(*b);
          }
      };
      std::map<const type_info*, X, compare_type_info> map;
      m[&typeid(int)] = something;
      

      上述碰撞是否安全?订购运营商是否保证覆盖!&lt;和!&gt;值?

      有没有办法在没有哈希冲突风险的情况下解决这个问题?

      在卷起我自己的类型系统方面,我已经这样做了,但typeid解决了从基类型(继承)中提供正确的最终类型的问题,我不想在我的基础上添加任何字段类(类型系统是“外部”)。

      即使在C ++ 11中我们仍然搞砸了? :/

1 个答案:

答案 0 :(得分:9)

你可以use std::type_index,它可以从std::type_info构建。这些是完全有序的,实现所有关系操作。 type_index甚至可以隐式转换为type_info