2

私は独自のエンティティ コンポーネント システムの作成に取り組んでおり、次のようにしてコンポーネントを取得できるように設定しています。

const auto& component = entity->GetComponent<ComponentType>();

上記の関数は次のようになります。

template <typename TyComponent>
TyComponent* Entity<T>::GetComponent() const
{
  return &(GetComponent(TyComponent::Id());
}

次に、見つかった場合は関連付けられた id に基づいてコンポーネントを返し、そうでない場合はコンポーネントを返しますnullptr

  1. 私がしていることは実行可能ですか?
  2. Component から派生した型のみをパラメーターとして使用できるようにする方法はありますGetComponentか?
4

1 に答える 1

2

このデザインはOKです。

誰かが試してみるとGetComponent<Foo>、すでにコンパイル時エラーが発生しますが、静的関数Fooはありません。Id()そのため、少し安全になります。

ただし、コンパイルするにはまだ 1 つの変更が必要です。これが私がそれを行う方法です:

Component * GetComponent(int id) { ... }

template <typename TyComponent>
TyComponent* Entity<T>::GetComponent() const {
  return dynamic_cast<TyComponent*>(GetComponent(TyComponent::Id()));
}

TyComponentがから派生していない場合、これはコンパイル エラーを生成するようになりましたComponent。(コンポーネントには、これが機能するために少なくとも 1 つの仮想関数が必要です。)

于 2015-07-04T07:02:07.670 に答える