1

エンティティクラス基本コンポーネントクラス、およびいくつかの基本コンポーネント派生クラスがあります。エンティティクラスには、基本コンポーネントポインタの配列が含まれています。

class CComponent
{
public:
  static unsigned GetType() { return -1; }; //Base identifier 
  //...
};

class CPoint : CComponent
{
  public:
    static unsigned GetType() { return 0; }; //Point identifier 
}

class CEntity
{
private:
  CComponent* aComponents[3];
public:
  // ... 
  //Getter by component ID here!
};

特定のコンポーネントタイプをその整数識別子(CPointコンポーネントクラスの場合は0)と一緒にマップして、Entityクラスの適切なタイプに簡単にキャストできるようにする方法を知りたいです。

:CPointコンポーネントをエンティティコンポーネント配列(もちろん位置0)に追加し、コンポーネントの整数識別子(この場合は0)を入力してCPoint(型キャスト)として取得したいとします。 。巨大な「スイッチ」ケースはできるだけ避けたいです!

PS:派生したもののプロパティと一致する、基本コンポーネントクラスの仮想関数の負荷を使用したくありません。(基本コンポーネントクラスに仮想SetPos関数を含めたくありませんが、その場所はCPointクラスにあります)。

PS#2:'etarion'がコメントしているように、私は次のようなものが欲しいです:

dynamic_cast<get_type_for(0)*>(obj)

もちろん、それが私が達成したいメカニズムです。それが可能かどうかはわかりません。

4

1 に答える 1

1

さて、私はあなたが望む種類のものを達成するためのいくつかの方法を知っています:

  • gccを使用すると、型を動的にキャストするための型を提供する非標準関数を使用できます。 ここtypeof(some_type)を参照してください。
  • C ++ 0xには、typeofを模倣する標準的な方法があります。decltype(some_type)
  • を実装するtype_infoクラスをtypeid提供する標準を使用できますoperator==
  • boost :: Variantは、コメントの1つで言及されている別の方法です(私はそれをよく知っています...)

my2c

于 2011-02-08T16:32:00.487 に答える