C++ 如何获取类名?

C++ 如何获取类名?,c++,classname,C++,Classname,如果我定义了一个类: class Blah {}; 我怎样才能: std::string const className = /* What do I need to do here? */; assert( className == "Blah" ); 我不认为typeid().name()是个好主意,因为它是特定的。是否有任何由C++标准或Boost?< /P>提供的东西? 注意:如果该类是从Qt的QObject继承的,我可以很容易地使用QMetaObject::className()来

如果我定义了一个类:

class Blah {};
我怎样才能:

std::string const className = /* What do I need to do here? */;
assert( className == "Blah" );
我不认为typeid().name()是个好主意,因为它是特定的。是否有任何由C++标准或Boost?< /P>提供的东西?
注意:如果该类是从Qt的QObject继承的,我可以很容易地使用
QMetaObject::className()
来获取类名。

我认为对于此类问题,没有任何非编译器特定的解决方案,在类声明中不涉及大量宏(实际上,如果我正确理解了QT文档,那么使用
objectName
获得的字符串实际上是“手动”分配的,我认为是使用
moc
创建的代码)

另一方面,一般来说,要检查对象的类是否是您不想要的类,不应该进行字符串比较,而应该进行typeid比较

assert(typeid(YourObject)==typeid(Blah));
但也许你应该更好地解释你想要实现的目标。

如下:

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

std::string const name = Blah::className();
assert(name == "Blah");
或者这个:

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");
class Blah : QObject { Q_OBJECT };
或者这个:。。。
或者…………<…> P> >通过查看它的名字来测试类听起来非常像java风格的方法,C++中,你应该小心使用相同的模式!最好使用类似于<代码> Boo::Type的特性< /代码>,并且可以是<代码> ISSUME < /COD>,用真实的类名。代码>可能是您正在寻找的内容。 它没有给出类的名称,但是它以您希望断言失败的方式失败,除非
Blah
的子类不会被捕获

我不认为typeid().name()是个好主意,因为它是编译器 具体实施

是的,标准不要求从实现开始就使用任何特定的命名,所以即使对于同一个编译器,它也可能会更改

< C++标准或Boost?< /P>是否提供了任何东西?
没有标准工具可以以某种规范形式返回类名。

QObject->metaObject()方法对Qt有效,但基于QGraphicsItem的类不是从QObject继承的。

另一种解决方案是typeid()+demangle。否则,您如何处理名称空间等?第一种情况是唯一严重的情况。它可读、易于维护和使用。第二种情况使一个简单的问题变得过于复杂。也许您更愿意使用REST api来调用Web服务?第三种情况被认为是坏习惯。当涉及到好的设计时,预处理器是最糟糕的,也是最不应该使用的。对于预处理器,我能想到的合理使用案例只有pragma一次。
class Blah : QObject { Q_OBJECT };