如何获得课程名称?

siv*_*udh 12 c++ classname

如果我定义了一个类:

class Blah {};
Run Code Online (Sandbox Code Playgroud)

我怎么能够:

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

我不认为typeid().name()是一个好主意,因为它是特定的编译器实现.有没有C++标准或Boost提供的东西?

注意:如果该类继承自Qt的QObject,我可以轻松地使用它QMetaObject::className()来获取类名.

Edw*_*nge 10

像这样:

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

std::string const name = Blah::className();
assert(name == "Blah");
Run Code Online (Sandbox Code Playgroud)

或这个:

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");
Run Code Online (Sandbox Code Playgroud)

爱好者:

#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();
...
Run Code Online (Sandbox Code Playgroud)

或这个:

class Blah : QObject { Q_OBJECT };
Run Code Online (Sandbox Code Playgroud)

或者这个:......或者这个:......

  • 另一个解决方案是typeid()+ demangle.否则,你怎么能处理名称空间等? (6认同)