问题 通过typeid的类的数字唯一标识符


typeid C ++中的operator返回类的对象 std::type_info 可以产生其文字名称。但是,我只是想为任何多态类获取唯一的数字标识符。 (在单个程序运行范围内是唯一的 - 不一定在运行之间)

在实践中,我可以取消引用指针并阅读 vptr的内容 - 但这既不优雅也不便携。我更喜欢便携式的方式。

我可以用吗? typeid 运算符以某种方式为类提供“安全”的数字标识符?例如,我可以依靠结果的地址 std::type_info 每个人的结构都是一样的 typeid 打电话给某个班级?或者也许是 name() 指针本身?


3353
2018-04-19 16:54


起源

您可以计算typeid名称的哈希值。由于这是一个字符串文字,因此它也应该在编译时解决。至少那就是我得到这个想法的“宝石”所说的......我的经历是不同的。对我来说,该解决方案的开销高得令人无法接受。但是,它肯定是便携式的,所以......是的。 - Damon
你真的想在这里解决什么问题? - Mark B
我试图抵制投射对象的地址的问题 void** 并为vptr取消引用它。 :D更严重 - 类似于二维vtable。 - Kos
对于单个模块,type_info结构的地址是唯一的,但至少在Windows上是afaik,对于多于1个模块(应用程序/动态库)的类型使用它是不安全的。 - smerlin


答案:


std :: type_index(C ++ 11)可以在容器中用于存储基于类型的值。但它不会给你一个数字。

std::type_index index = std::type_index (typeid (int));

更多: http://en.cppreference.com/w/cpp/types/type_index

type_index class是一个包装类 std::type_info 对象,那 可以在关联和无序关联容器中用作索引。与...的关系 type_info object是通过指针维护的,因此type_index是CopyConstructible和CopyAssignable。


6
2017-10-06 10:48





type_info有一个operator ==(),用于将它描述的类型与另一个type_info对象的类型进行比较。这些对象也保证比计划寿命更长。

因此,如果你保存两个type_infos的地址,你就可以逃脱 *p1 == *p2 看他们是否引用相同的类型。


4
2018-04-19 17:28





使用计数器初始化的静态数据成员?然后使用MyClass :: id作为唯一标识符。然后使用虚函数根据基类获取唯一标识符。由于您需要实现静态变量并为您创建的每个新类实现虚函数,因此保证可移植,但具有轻微的维护负担。但是,猜测这不是一个大问题,因为你已经选择使用c ++,这已知是冗长的。它看起来像这样:

class Base { virtual int get_id() const=0; };
class Derived : public Base { static int id; int get_id() const { return id; } };
int algo() { static int count=0; count++; return count; }
static int Derived::id = algo();

0
2018-04-19 17:06



这是可能的,但RTTI是不是出于完全不需要编写和维护这些代码的目的而发明的?这是编译器的工作,而不是我的。 - Kos
好吧,重点是在c ++中,如果你真的做了工作并编写了大量的样板代码,那么你有时会得到更好的代码。 - tp1


好像 TYPE_INFO :: hash_code() 是为C ++ 0x规定的。


0
2018-04-19 17:15



警告!每个标准:hash_code()不需要为两种不同的类型返回不同的id。它是哈希码而不是密钥。 - Christopher Oezbek
所以它不能保证是独一无二的吗? - GameDeveloper
-1不正确。 (见上面的克里斯托弗) - Petter