在新标准形成期间的某个地方,有一个更容易type_info
使用的承诺,其中包括hash_code
. 在 C++11 中实现反射系统但是我再次遇到了唯一类型识别的问题。
我需要:
- 允许我使用 typeid 从类型中提取唯一标识符的东西
- 唯一标识符需要能够在键/值容器中使用
- 标识符不需要是可移植的,甚至在程序执行之间也不需要相同
请注意,我不需要程序执行之间的持久性。看起来:
.name()
完全没用,因为该标准对此没有任何保证。.hash_code()
也是无用的,因为它不能保证是唯一的- 获取指向
type_info
对象的指针并不适用于任何地方(例如跨 DLL) - 只是
.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 中,我们仍然被搞砸了?:/