How to get class name?

筅森魡賤 提交于 2019-11-28 23:33:34

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: ...

Nim

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.

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.

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.

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

Gene Bushuyev

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.

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