5

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

我需要:

  1. 允许我使用 typeid 从类型中提取唯一标识符的东西
  2. 唯一标识符需要能够在键/值容器中使用
  3. 标识符不需要是可移植的,甚至在程序执行之间也不需要相同

请注意,我不需要程序执行之间的持久性。看起来:

  1. .name()完全没用,因为该标准对此没有任何保证。
  2. .hash_code()也是无用的,因为它不能保证是唯一的
  3. 获取指向type_info对象的指针并不适用于任何地方(例如跨 DLL)
  4. 只是.before()似乎有用-尽管我不知道它是否不会遇到与#3相同的问题

即使.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;

以上碰撞安全吗?排序运算符是否保证覆盖 !< 和 !> 值?

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

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

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

4

1 回答 1

9

您可以使用std::type_index,它可以从std::type_info. 这些是完全有序的,实现了所有的关系操作。Atype_index甚至可以从 隐式转换type_info

于 2013-06-01T17:34:14.123 回答