12

クラスを定義した場合:

class Blah {};

どうやって:

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

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

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

4

6 に答える 6

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

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

于 2010-12-16T22:53:35.770 に答える
3

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

于 2010-12-16T22:53:49.943 に答える
1

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

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

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

しかし、おそらく、達成しようとしていることをよりよく説明する必要があります。

于 2010-12-16T22:44:42.490 に答える
1

私はdynamic_castあなたが探しているものかもしれないと思います。クラスの名前は表示されませんが、アサーションが失敗するようにしたい方法で失敗します。ただし、のサブクラスはBlahキャッチされません。

于 2010-12-16T22:57:16.637 に答える
1

typeid().name() はコンパイラの実装に固有であるため、良い考えだとは思いません。

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

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

クラス名を正規の形式で返す標準機能はありません。

于 2010-12-16T23:16:13.297 に答える
1

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

于 2011-11-10T14:25:05.847 に答える