我正在创建一个资源管理器,它接受从类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’?
解决方法
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;
然后在每个子类中重写它以返回类的名称.