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