Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中唯一类型标识的最安全方式+;11_C++_C++11_Typeid - Fatal编程技术网

C++ C+中唯一类型标识的最安全方式+;11

C++ C+中唯一类型标识的最安全方式+;11,c++,c++11,typeid,C++,C++11,Typeid,在新标准形成期间的某个地方,有一个更容易使用type\u info的承诺,这导致了hash\u code的实施。在C++11中实现反射系统,但是我再次遇到了唯一类型标识的问题 我需要: 允许我使用typeid从类型中提取唯一标识符的东西 唯一标识符需要能够在密钥/值容器中使用 标识符不需要是可移植的,甚至在程序执行之间也不需要相同 注意,我不需要程序执行之间的持久性。看起来: .name()是完全无用的,因为标准对它没有任何保证 .hash\u code()也没用,因为它不能保证是唯一的 将指针

在新标准形成期间的某个地方,有一个更容易使用
type\u info
的承诺,这导致了
hash\u code
的实施。在C++11中实现反射系统,但是我再次遇到了唯一类型标识的问题

我需要:

  • 允许我使用typeid从类型中提取唯一标识符的东西
  • 唯一标识符需要能够在密钥/值容器中使用
  • 标识符不需要是可移植的,甚至在程序执行之间也不需要相同
  • 注意,我不需要程序执行之间的持久性。看起来:

  • .name()
    是完全无用的,因为标准对它没有任何保证
  • .hash\u code()
    也没用,因为它不能保证是唯一的
  • 将指针指向
    type_info
    对象不会在任何地方都有效(例如跨DLL)
  • 只有
    .before()
    似乎很有用——尽管我不知道它是否会遇到与#3相同的问题
  • 即使要使用
    .before()
    ,我们也可以使用
    map
    ,而我更喜欢使用
    unordered\u 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;
    
    结构比较类型信息{ 布尔运算符()(常数类型信息*a,常数类型信息*b)常数{ 返回a->before(*b); } }; 地图; m[&typeid(int)]=某物; 上述车辆碰撞安全吗?订购操作员是否保证覆盖!<还有!>价值观

    有没有一种方法可以在没有哈希冲突风险的情况下解决此问题

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


    即使在C++11中,我们还是完蛋了吗/

    您可以,它可以从
    std::type_info
    构造。它们是完全有序的,实现了所有的关系操作。
    type\u索引
    甚至可以从
    type\u信息

    隐式转换为“有一个简化type\u信息使用的承诺”不,没有。这不是
    hash\u code
    的目的。还有,你有什么理由不能使用
    type\u info
    本身吗?@Nicol,我想加入更多关于类型(反射)的信息。我得到了那部分。你为什么不能用
    输入信息
    ?为什么你不能在一个无序的映射中使用它作为你的键呢?我有一个对象*指针-我想访问我的类型数据库,所以我需要从对象*指针中取出真正的类型指针(派生的*),因为除了通过typeid()没有别的方法。所以我想要一个typeid->my type info的索引。但是,typeinfo在执行过程中可能会被扩展,因此它不能有重复项,并且必须始终可返回。标准中绝对没有提到“不同的DLL”。但我希望它们能以这种方式工作。@KornelKisielewicz:“它没有说明typeinfo实例的唯一性”为什么?
    type\u info
    的内容才是最重要的。如果两个type_info实例引用相同的类型,则它们的比较结果相等。如果没有,那么它们将具有一些任意排序。你还想要什么?@KornelKisielewicz:
    type\u info
    怎么办不到呢?在标准中,哪里允许引用不同类型的两个
    type\u info
    对象进行相等的比较?好吧,它不允许两个typeid调用返回不同的type\u info对象。@KornelKisielewicz:“参见此讨论”讨论完全无关。特定type_info实例的内存来自何处并不重要。重要的是标准所说的当他们比较相等时会发生什么。