c++ - C++11 中唯一类型标识的最安全方法

标签 c++ c++11 typeid

在新标准形成期间的某处,曾 promise 更容易使用 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 解决了从基类型(继承)提供正确的最终类型的问题,我不想添加任何我的类(class)的字段(类型系统是“外部”)。

即使在 C++11 中,我们仍然一团糟吗? :/

最佳答案

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

关于c++ - C++11 中唯一类型标识的最安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16875255/

相关文章:

c++ - 有没有办法在变量中存储类型说明符?

c++ - 将指针移动到其他位置后删除分配的内存

c++ - C++ 模板中变量后面的 "&"是什么?

c++ - 通过 typeid 的类的数字唯一标识符

c++ - 在 C++11 中有选择地禁用模板成员的简单方法

c++ - 我可以修改 std::priority_queue 以增加重复数据的计数吗?

c++ - 检查容器类型

c++ - boost 程序选项: Read required parameter from config file

c++ - 在 CLion 中编辑默认的 main.cpp 文件

c++ - C++11 类中的多线程