在新标准形成期间的某个地方,承诺更容易type_info
使用,其中包括hash_code
的实施。在C ++ 11中实现反射系统然而我又遇到了一个带有唯一类型识别的问题。
我需要:
请注意,我不需要在程序执行之间保持持久性。看起来似乎:
.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;
上述碰撞是否安全?订购运营商是否保证覆盖!&lt;和!&gt;值?
有没有办法在没有哈希冲突风险的情况下解决这个问题?
在卷起我自己的类型系统方面,我已经这样做了,但typeid
解决了从基类型(继承)中提供正确的最终类型的问题,我不想在我的基础上添加任何字段类(类型系统是“外部”)。
即使在C ++ 11中我们仍然搞砸了? :/
答案 0 :(得分:9)
你可以use std::type_index
,它可以从std::type_info
构建。这些是完全有序的,实现所有关系操作。 type_index
甚至可以隐式转换为type_info
。