在新标准形成期间的某处,曾 promise 更容易使用 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
解决了从基类型(继承)提供正确的最终类型的问题,我不想添加任何我的类(class)的字段(类型系统是“外部”)。
即使在 C++11 中,我们仍然一团糟吗? :/
最佳答案
您可以 use std::type_index
,可从 std::type_info
构造。这些是完全有序的,实现了所有的关系操作。 type_index
甚至可以从 type_info
隐式转换。
关于c++ - C++11 中唯一类型标识的最安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16875255/