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

时间:2011-04-19 16:54:27

标签: c++ rtti typeid

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

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

我能否以某种方式使用typeid运算符为类提供“安全”的数字标识符?例如,对于给定类的每个std::type_info调用,我可以指望结果typeid结构的地址是相同的吗?或者也许是name()指针本身?

4 个答案:

答案 0 :(得分:6)

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类是围绕std::type_info对象的包装类,可以用作关联和无序关联容器中的索引。与type_info对象的关系通过指针保持,因此type_index是CopyConstructible和CopyAssignable。

答案 1 :(得分:4)

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

因此,如果您保存两个type_infos的地址,您可以使用*p1 == *p2来查看它们是否引用相同的类型。

答案 2 :(得分:0)

使用计数器初始化的静态数据成员?然后使用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();

答案 3 :(得分:0)

看起来为{+ 3}}规定了C ++ 0x。