0

複数の型の要素を単一のベクトルに格納し、同じ型の要素を連続させたいと考えています。型は基本クラスから派生しており、開発サイクル全体でさまざまな型が実装されることを期待しています。このため、新しいタイプをリストに追加するプロセスが非常に単純であると役立ちます。

次の方法でこれを(ある程度)達成できます。

//header
enum TypeID { TypeA_ID, TypeA_ID, TypeA_ID, TypeIDAmount };

vector<TypeA> vectorA;
vector<TypeB> vectorB;
vector<TypeC> vectorC;

//cpp
TypeBase* LookUp(TypeID type, int index)
{
    switch(type)
    {
    case TypeA_ID: return (TypeBase*) &vectorA[index];
    case TypeB_ID: return (TypeBase*) &vectorB[index];
    case TypeC_ID: return (TypeBase*) &vectorC[index];
    }
}

ただし、これはきれいではなく、保守が容易でもなく、コンパイルにも適していません (データを保持するクラスは多くの場所に含まれています)。

よりコンパイルしやすい(しかし醜い)オプションは、このようなことをしていると思いました

//header
void* vectorArray;

//cpp
void Initialize()
{
    vectorArray = new void*[TypeIDAmount];
    vectorArray[0] = new vector<TypeA>;
    vectorArray[1] = new vector<TypeB>;
    vectorArray[2] = new vector<TypeC>;
}

TypeBase* LookUp(TypeID type, int index)
{
    void* pTypedVector = &vectorArray[type];
    switch(type)
    {
    case TypeA_ID: return (TypeBase*) (*(vector<TypeA>*)pTypedVector)[index];
    case TypeB_ID: return (TypeBase*) (*(vector<TypeB>*)pTypedVector)[index];
    case TypeC_ID: return (TypeBase*) (*(vector<TypeC>*)pTypedVector)[index];
    }
}

(うーん!)

このように一般的に機能するものはありますか?

vector< vector<?>* > vectorOfVariedVectors;

編集:

この構造の動機は、Entity-Component デザイン パターンにコンポーネントを格納することです。

タイプ (というか、コンポーネント) を連続させたい理由は、キャッシュに適した方法でそれらを横断できるようにするためです。これは、インスタンス自体が連続していることを意味します。連続したポインターを使用すると、私が望むものと同様の動作が得られますが、それらがメモリ内の「ランダムな」場所を指している場合、データをフェッチするときにキャッシュミスが発生します。

メモリの断片化を回避することは、これの優れた追加の利点です。

主なアイデアは、これらの要素へのアクセスを保持および提供するクリーンなマネージャー型クラスを用意することです。他の開発者がこのクラスに追加する必要がある複数のメンバー ベクトルを持つことは、新しいクラスを作成するユーザーがこのマネージャー クラスを変更する必要がある限り、望ましくありません。このコンテナ クラスへの編集は、できる限り単純にするか、できれば存在しないようにする必要があります。

解決策が見つかりました

この記事を教えてくれた Dmitry Ledentsov に感謝します。これは私が探していたものです。

4

1 に答える 1