如果我定义了一个类:
class Blah {};
我怎么能:
std::string const className = /* What do I need to do here? */;
assert( className == "Blah" );
我不认为typeid()。name()是一个好主意,因为它是compiler implementation特定的。有没有C ++标准或Boost提供的东西?
注意:如果该类继承自Qt的QObject,我可以轻松使用QMetaObject::className()
来获取类名。
答案 0 :(得分:10)
像这样:
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");
票友:
#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();
...
或者这个:
class Blah : QObject { Q_OBJECT };
或者这个:...... 或者这个:......
答案 1 :(得分:3)
通过查看它的名称测试一个类听起来非常像我的Java风格方法,在C ++中,你应该小心尝试应用相同的模式!更好的方法是使用类似boost::type_traits
的内容,可能是is_same
,使用真实的类名。
答案 2 :(得分:1)
我认为没有任何针对此类问题的非编译器特定解决方案在类声明中不涉及大量宏(实际上,如果我正确理解QT文档,则objectName
实际上是字符串“手工”分配,我认为使用moc
创建的代码。
另一方面,通常要检查对象的类是否是您不想要的对象,不应该进行字符串比较,而是进行typeid比较。
assert(typeid(YourObject)==typeid(Blah));
但是你应该更好地解释一下你想要达到的目标。
答案 3 :(得分:1)
我认为dynamic_cast
可能正是您要找的。
它没有为您提供类的名称,但它会以您希望断言失败的方式失败,除非Blah
的子类不会被捕获。
答案 4 :(得分:1)
我不认为typeid()。name()是一个好主意,因为它是编译器 具体实施。
是的,标准不要求从实现中使用任何特定的命名,因此即使对于相同的编译器它也可能会改变。
C ++标准或Boost提供了什么?
没有任何标准设施能以某种形式返回班级名称。
答案 5 :(得分:1)
QObject-&gt; metaObject()方法对Qt有效,但基于QGraphicsItem的类不能从QObject继承......