C++ では、プレーン オールド データ (POD) には実行時の型情報がありません。説明されているすべてのクラスは正確に 1 バイトを取り、空の基本クラスの最適化を使用するどのコンパイラでも同一の実行時表現を持ちます。
そのため、あなたが望むことはできません。
基本クラスに仮想デストラクタを追加すると、RTTI とdynamic_cast
サポートが追加されます。
派生クラスごとに異なる方法で初期化されるenum
orフィールドをベースに追加することも機能します。int
さらに別のオプションは、テンプレート関数を作成し、次のようにポインターを保存することです。
using my_type_id=void(*)();
template<class>void get_my_type_id_helper(){};
template<class T> my_type_id get_my_type_id(){return get_my_type_id_helper<T>;}
my_type_id
次に、適切に初期化されたinを格納しA
ます。これは RTTI の再発明であり、より多くの機能が必要になると、C++ RTTI オーバーヘッドに近づきます。
C++ では、要求したものに対してのみ料金を支払います。RTTI を使用せずにクラスを要求して、それを取得できます。
RTTI はランタイム タイプ情報です。POD は単純な古いデータであり、C++03 用語です。多くのクラスは POD ではありません。簡単な方法は、virtual
デストラクタを追加することです。C++11 には、よりきめ細かい標準レイアウトと集計用語があります。
技術的には、RTTI と POD は相反するものではありません。POD ではない RTTI のないクラスがあります。
MSVC には RTTI を生成しないオプションがあり、そのアグレッシブな Comdat フォールディングは、上記の手動 RTTI を壊す可能性があることに注意してください。どちらの場合も標準に違反しています。