エンティティ システムを構築しようとしています。各エンティティには、関連付けられたコンポーネントのコレクションがあり、各コンポーネントは一意のタイプです。すべてのコンポーネントは、基本コンポーネント クラスから派生します。
なんらかの方法で (つまり、テンプレートを使用して) 変数としてコンポーネント タイプを取得する、コンポーネントの追加/削除/取得のクラスを作成する必要があります。これらが呼び出されるたびに eg を使用してコンポーネント タイプをチェックするのtypeid
は効率的ではないため、各派生コンポーネント クラスの識別子を生成する必要があります。ここの他の投稿では、CRTPの使用や、派生クラスを定義するたびに呼び出す必要があるテンプレート関数の使用など、いくつかの方法でこれが行われているのを見てきました。
これらのメソッドに関する私の問題 (これは主に個人的なものです) は、新しい Component クラスの作成に関心がある可能性のある人に、上記のメソッドのいずれかを使用する必要があることを通知するために、少なくともある種のコメントを追加する必要があることです。コード自体には明示的に表示されません。
したがって、エンティティ システムを使用する可能性がある人に特別なルールを適用することなく、 RTTIの保存を何とかきれいに処理する方法を探しています。
addComponent
例として、これに対する私の最善の解釈は、関数で型チェックを行うことです。これは、一意のクラスをカウントし、そのクラスの ID を返すテンプレート関数を使用して行われます。
extern int component_id_count;
int component_id_count = 0;
template <class T>
int getComponentID(void){
static int id = component_id_count++;
return id;
}
次に、id が最後に検出された id より大きいかどうかを確認します。そうである場合、新しいコンポーネント タイプが検出され、登録する必要があります。addComponent
が何度も呼び出されない場合、これは非常に効率的です。しかし、私が達成したいことへのより効率的なアプローチがあるかどうかはまだ疑問に思っています.