0

私はすでにポリモーフィズムを使用し、リストにbaseClassへのポインターを格納させることを理解しましたが、そこに正常に配置した後、オブジェクトが元々どのクラスであったかを知りたいと思います。クラスにテンプレートを使用していて、基本タイプの列挙型となる別のフィールドが必要でした。

さて、質問:(実行時またはコンパイル中に)チェックする方法はありますか?

(if T == int)  
   field = INT

私はプリプロセッサに何かあるかもしれませんが、それについてはよく知りません。

4

4 に答える 4

4

ポリモーフィズムの背後にある全体的な考え方は、特定の実装を隠して、プログラム フローで透過的にすることです。クラスのタイプをインジケーターとして使用すると、コードがifステートメントで肥大化し、保守が難しくなります。

設計を再考し、意図した動作メソッドを使用して抽象クラスを作成し、このクラス タイプをリスト オブジェクト タイプとして使用することをお勧めします。オブジェクトごとにインターフェイス メソッドを呼び出すよりも (抽象クラスで宣言され、派生クラスで実装されます)

于 2012-06-10T17:04:08.830 に答える
1

演算子を使用できますtypeid

たとえばT、基底クラスへのポインタの場合:

if (typeid(SomeDerivedClass) == typeid(*T))
...

int(ポリモーフィズムに関連し てなぜあなたが話しているのか、私にはやや不明確です.intから派生することはできません。)

于 2012-06-10T17:02:14.017 に答える
1

おそらく探しているものは、型特性として知られています。これらを使用すると、特定のタイプの属性を決定して操作できます。要件に応じて、そこから始めて構築するstd::is_integral()ことができます。std::is_floating_point()

enum Type
{
    Unknown,
    Integral,
    Float
};

....

Type field = Unknown;

if(std::is_integral<T>::value)
{
    field = Integral;
}

else if(std::is_floating_point<T>::value)
{
    field = Float;
}
于 2012-06-10T17:28:01.990 に答える
0

C++ プリプロセッサは、C++ について何も知りません。これは、ほとんどすべてのプログラミング言語で使用できる汎用シンボル マニピュレータであり、さらに言えば、単語や数式のレイアウト処理の機能など、任意のテキスト処理アプリケーションでも使用できます。

このようなメカニズムを構築する 1 つの方法としてtypeid演算子を調べることができますが、そのページのさらに下にある「 RTTIの誤用」セクションに注意してください。

于 2012-06-10T17:04:12.737 に答える