How to get class name?

余生长醉 提交于 2019-11-30 07:01:06

问题


If I defined a class:

class Blah {};

How can I:

std::string const className = /* What do I need to do here? */;
assert( className == "Blah" );

I dont think typeid().name() is a good idea since it's compiler implementation specific. Is there anything provided by the C++ standard or Boost?

Note: If the class were inherited from Qt's QObject, I could easily use QMetaObject::className() to get the class name.


回答1:


Like this:

class Blah { static std::string const className() { return "Blah"; }};

std::string const name = Blah::className();
assert(name == "Blah");

Or this:

class Blah {};

template < typename T > struct name;
template < > struct name<Blah> { static std::string value() { return "Blah"; }};

std::string const classname = name<Blah>::value();
assert(classname == "Blah");

Fancier:

#define DECLARE_NAMED_CLASS( Name ) \
struct Name;\
template < > struct name<Name> { static std::string value() { return #Name; }};\
struct Name

DECLARE_NAMED_CLASS(Blah) {};
std::string const className = name<Blah>::value();
...

Or this:

class Blah : QObject { Q_OBJECT };

Or this:... Or this: ...




回答2:


Testing a class by looking at it's name sounds awfully like a Java style approach to me, and in C++, you should be wary of trying to apply the same patterns! A better way would be to use something like boost::type_traits, and may be is_same, with the real class name.




回答3:


I think a dynamic_cast may be what you are looking for. It does not give you the name of the class, but it fails in the way you would like your assertion to fail, except that subclasses of Blah will not be caught.




回答4:


I don't think there's any non-compiler specific solution to such problem that does not involve plenty of macros in the class declaration (actually if I understood correctly the QT documentation the string you get with objectName is actually assigned "by hand", I think with code created by moc).

On the other hand, in general to check if the class of an object is one you don't want you shouldn't do a string comparison, but instead make a typeid comparison.

assert(typeid(YourObject)==typeid(Blah));

But probably you should explain better what you're trying to achieve.




回答5:


The QObject->metaObject() method is valid for Qt except the QGraphicsItem based classes that not inherit from QObject...




回答6:


I dont think typeid().name() is a good idea since it's compiler implementation specific.

Yes, standard doesn't require from implementation to use any specific naming, so it may change even for the same compiler.

Is there anything provided by the C++ standard or Boost?

There are no standard facilities that would return class name in some canonic form.



来源:https://stackoverflow.com/questions/4466088/how-to-get-class-name

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!