C ++中的typeid
运算符返回类std::type_info
的对象,该对象可以生成其文本名称。但是,我只想为任何多态类获取唯一的数字标识符。 (在单个程序运行范围内是唯一的 - 不一定在运行之间)
在实践中,我可以取消引用指针并读取vptr
的内容 - 但这既不优雅也不便携。我更喜欢便携式的方式。
我能否以某种方式使用typeid
运算符为类提供“安全”的数字标识符?例如,对于给定类的每个std::type_info
调用,我可以指望结果typeid
结构的地址是相同的吗?或者也许是name()
指针本身?
答案 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。