クラスを定義した場合:
_class Blah {};
_
どうやって:
_std::string const className = /* What do I need to do here? */;
assert( className == "Blah" );
_
Typeid()。name()は コンパイラの実装 固有であるため、良い考えではないと思います。 C++標準またはBoostによって提供されるものはありますか?
注:クラスがQtのQObjectから継承されている場合は、QMetaObject::className()
を使用してクラス名を簡単に取得できます。
このような:
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 };
またはこれ:...またはこれ:.。
クラスの名前を見てテストすることは、私にとってJavaスタイルのアプローチのように聞こえます。C++では、同じパターンを適用しようとすることに注意する必要があります。より良い方法は、何かのようなもの boost::type_traits
、 そして多分 is_same
、実際のクラス名。
dynamic_cast
あなたが探しているものかもしれません。クラスの名前はわかりませんが、Blah
のサブクラスがキャッチされないことを除いて、アサーションを失敗させたい方法で失敗します。
QObject-> metaObject()メソッドは、QObjectから継承しないQGraphicsItemベースのクラスを除いてQtに有効です。
Typeid()。name()はコンパイラの実装に固有であるため、良い考えではないと思います。
はい、標準は実装から特定の命名を使用する必要がないため、同じコンパイラでも変更される可能性があります。
C++標準またはBoostによって提供されるものはありますか?
何らかの標準的な形式でクラス名を返す標準的な機能はありません。
クラス宣言に多くのマクロが含まれていない、このような問題に対するコンパイラ固有ではない解決策はないと思います(実際、QTドキュメントを正しく理解していれば、objectName
で取得した文字列は実際に割り当てられます "手作業で」、moc
)によって作成されたコードで考えます。
一方、一般に、オブジェクトのクラスが不要なクラスであるかどうかを確認するには、文字列の比較を行うのではなく、typeidの比較を行う必要があります。
assert(typeid(YourObject)==typeid(Blah));
しかし、おそらくあなたはあなたが達成しようとしていることをよりよく説明するべきです。