c – 使用typeid获取派生类的名称

前端之家收集整理的这篇文章主要介绍了c – 使用typeid获取派生类的名称前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在创建一个资源管理器,它接受从类Resource派生的类.我的问题是typeid(..).name()返回错误的类名.

我想将像Texture这样的资源添加到地图中,如下所示:

typedef std::unordered_map<std::string,Resource*> ResourceMap;

我希望’类计数器’的名称是资源的字符串/名称.不幸的是,一切都被称为P8Resource,因为这些类派生自’资源’.确实是一个不合时宜的困境,但是typeid必须知道纹理是纹理,而不是资源.

class Resource {}; // abstract

class Texture : public Resource {};

Resource *texture = new Texture();
Texture *texture2 = new Texture();

typeid(texture).name(); // yields 'Resource'
typeid(texture2).name(); // yields 'Texture'

如何在不使用类型转换的情况下使第一个typeid语句产生’Texture’?

解决方法

@H_403_15@

My problem is that typeid(..).name() returns the wrong name of the
class.

typeid(…).name()仅用于调试或记录目的.正如http://en.cppreference.com/w/cpp/types/type_info/name所说:

No guarantees are given,in particular,the returned string can be
identical for several types and change between invocations of the same
program.

至于你的问题,

How can I make the first typeid statement yield ‘Texture’ without
using type conversions?

最安全,最简单和最正确的方法是向Resource添加您自己的虚拟名称功能

virtual std::string name() const = 0;

然后在每个子类中重写它以返回类的名称.

猜你在找的C&C++相关文章