web-dev-qa-db-ja.com

プログラムによるC ++クラス名の取得

C++では、変数やゲッターにハードコードすることなく、文字列形式でクラスの名前を取得できるかどうか疑問に思っていました。その情報は実行時に実際に使用されないため、利用できないことは承知していますが、この機能を作成するために作成できるマクロはありますか?

編集:派生クラスの名前を実際に取得しようとしており、Visual C++ 2008 Express Editionを使用していることに注意してください。

54
Morgan

typeidを使用できます:

#include <typeinfo>
cout << typeid(obj).name() << endl;

ただし、この形式は標準化されておらず、異なるコンパイラ(または同じコンパイラの異なるバージョン)の間で異なる場合があるため、これは推奨されません。

88
Konrad Rudolph

特定のクラスかどうかだけを確認したい場合は、

typeid(obj) == typeid(CSubClass)

実装に関係なく常に機能します。

そうでなければ、宣言するのが便利な方法です:

virtual const char* classname() { return "CMyClass";}

サブクラスごとに実装します。

35
fchen

typeid(obj).name()の値は、オブジェクトの実際の型(クラス)ではなく、常に宣言された変数の型を示します。 objが宣言されたクラスのサブクラスのインスタンスに変数objが割り当てられている場合、残念ながらtypeidはそれを明らかにしません。

10
jbillfinger