gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:57:51 24 4
gpt4 key购买 nike

我正在创建一个资源管理器,它接受从类 Resource 派生的类。我的问题是 typeid(..).name() 返回错误的类名。

我想像这样将纹理等资源添加到 map 中:

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

我希望“类 + 计数器”的名称是资源的字符串/名称。不幸的是,所有东西最终都被称为 P8Resource,因为这些类派生自“Resource”。确实是一个不合时宜的困境,但 typeid 必须以某种方式知道 texture 是一个纹理,而不是资源。

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”?

最佳答案

指针的

typeid 始终是声明的类型,因为那是指针本身的真实类型。要知道指针指向的对象的真实类型,您需要取消引用指针以获取实际类型:http://ideone.com/FYmp79

#include <iostream>
#include <typeinfo>
using namespace std;

struct Resource {
virtual ~Resource() = default;
};

struct Texture : Resource {};

int main() {
Resource *resource = new Resource;
Resource *texture = new Texture;

cout << typeid(*resource).name() << endl; // yields 'Resource'
cout << typeid(*texture).name() << endl; // yields 'Texture'
return 0;
}

编辑:正如其他人所说,您需要使类多态才能获取运行时类型信息。

关于c++ - 使用 typeid 获取派生类的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32016809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com