以编程方式检索c ++类名

Mor*_*gan 54 c++ macros class

我想知道在C++中是否有可能以字符串形式检索类的名称而无需将其硬编码为变量或getter.我知道这些信息实际上并没有在运行时使用,因此它不可用,但有没有可用于创建此功能的宏?

编辑:可能有助于注意我实际上是在尝试检索派生类的名称,而我正在使用Visual C++ 2008 Express Edition.

Kon*_*lph 88

你可以使用typeid:

#include <typeinfo>
cout << typeid(obj).name() << endl;
Run Code Online (Sandbox Code Playgroud)

但是,这是不鼓励的,因为格式不是标准化的,并且可能在不同的编译器(甚至同一编译器的不同版本)之间有所不同.

  • @LeopardSkinPillBoxHat:是的,它会起作用(参见§5.2.8/ 3和4).一个常见的误解是"typeid"只适用于多态类型,可能源于与RTTI功能的相似性. - 实际上,在静态类型上使用`typeid`不需要也不使用RTTI.在编译时对运算符进行求值,并将结果编译成(严格来说,这是一个实现细节,但它是唯一理智的实现). (7认同)

fch*_*hen 35

如果你只想检查它是否属于某个类,那么

typeid(obj) == typeid(CSubClass)
Run Code Online (Sandbox Code Playgroud)

无论实施如何,它都将始终有效.

否则,一种方便的方法是声明:

virtual const char* classname() { return "CMyClass";}
Run Code Online (Sandbox Code Playgroud)

并实现每个子类.

  • 简单,简单,编译.错了,不幸的是.`typeid()`返回一个`typeinfo*`,一个指针.如果两个`typeinfo*`指针相等,它们引用相同的类型,但如果它们不相等,它们仍然可以引用相同的类型.这就是为什么有一个带有正确语义的`std :: type_index`类.`std :: type_index(typeid(obj))== std :: type_index(typeid(CSubClass))`将为真**当且仅当**两种类型相等时. (6认同)

小智 10

typeid(obj).name()事情总是给人变量,因为它被宣布,而不是实际的类型(类)对象的类型.如果将变量obj分配给obj被声明为的类的子类的实例,则不幸的是,typeid不会显示该实例.

  • 使用GCC 4.7.3,使用typeid(*somePtr).name()为我提供具体类的名称. (7认同)
  • 我遇到了同样的问题,但@ stephelton的评论让我意识到我是在指针而不是实际的对象或引用上调用它而且它返回了指针的类型!只需添加`*`修复所有内容. (3认同)