Is there a __CLASS__ macro in C++?
The closest thing there's is to call typeid(your_class).name()
- but this produces compiler specific mangled name.
To use it inside class just typeid(*this).name()
The problem with using typeid(*this).name()
is that there is no this
pointer in a static method call. The macro __PRETTY_FUNCTION__
reports a class name in static functions as well as method calls. However, this will only work with gcc.
Here's an example of extracting the information through a macro style interface.
inline std::string methodName(const std::string& prettyFunction)
{
size_t colons = prettyFunction.find("::");
size_t begin = prettyFunction.substr(0,colons).rfind(" ") + 1;
size_t end = prettyFunction.rfind("(") - begin;
return prettyFunction.substr(begin,end) + "()";
}
#define __METHOD_NAME__ methodName(__PRETTY_FUNCTION__)
The macro __METHOD_NAME__
will return a string of the form <class>::<method>()
, trimming the return type, modifiers and arguments from what __PRETTY_FUNCTION__
gives you.
For something which extracts just the class name, some care must be taken to trap situations where there is no class:
inline std::string className(const std::string& prettyFunction)
{
size_t colons = prettyFunction.find("::");
if (colons == std::string::npos)
return "::";
size_t begin = prettyFunction.substr(0,colons).rfind(" ") + 1;
size_t end = colons - begin;
return prettyFunction.substr(begin,end);
}
#define __CLASS_NAME__ className(__PRETTY_FUNCTION__)
Not yet. (I think __class__
is proposed somewhere). You can also try to extract class part from __PRETTY_FUNCTION__
.