web-dev-qa-db-ja.com

クラス名を取得する方法は?

クラスを定義した場合:

_class Blah {};
_

どうやって:

_std::string const className = /* What do I need to do here? */;
assert( className == "Blah" );
_

Typeid()。name()は コンパイラの実装 固有であるため、良い考えではないと思います。 C++標準またはBoostによって提供されるものはありますか?

注:クラスがQtのQObjectから継承されている場合は、QMetaObject::className()を使用してクラス名を簡単に取得できます。

12
sivabudh

このような:

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 };

またはこれ:...またはこれ:.。

10
Edward Strange

クラスの名前を見てテストすることは、私にとってJavaスタイルのアプローチのように聞こえます。C++では、同じパターンを適用しようとすることに注意する必要があります。より良い方法は、何かのようなもの boost::type_traits、 そして多分 is_same、実際のクラス名。

3
Nim

dynamic_castあなたが探しているものかもしれません。クラスの名前はわかりませんが、Blahのサブクラスがキャッチされないことを除いて、アサーションを失敗させたい方法で失敗します。

1
Jørgen Fogh

QObject-> metaObject()メソッドは、QObjectから継承しないQGraphicsItemベースのクラスを除いてQtに有効です。

1
MasterMito

Typeid()。name()はコンパイラの実装に固有であるため、良い考えではないと思います。

はい、標準は実装から特定の命名を使用する必要がないため、同じコンパイラでも変更される可能性があります。

C++標準またはBoostによって提供されるものはありますか?

何らかの標準的な形式でクラス名を返す標準的な機能はありません。

1
Gene Bushuyev

クラス宣言に多くのマクロが含まれていない、このような問題に対するコンパイラ固有ではない解決策はないと思います(実際、QTドキュメントを正しく理解していれば、objectNameで取得した文字列は実際に割り当てられます "手作業で」、moc)によって作成されたコードで考えます。

一方、一般に、オブジェクトのクラスが不要なクラスであるかどうかを確認するには、文字列の比較を行うのではなく、typeidの比​​較を行う必要があります。

assert(typeid(YourObject)==typeid(Blah));

しかし、おそらくあなたはあなたが達成しようとしていることをよりよく説明するべきです。

1
Matteo Italia