2

BaseStorageさまざまな実行時データを格納する struct と、(または派生した) typedef と、変更されず、 struct の複数のインスタンスから読み取られる「静的」データを保持する structがありBaseStaticます。 には、その読み取り専用の共有データにアクセスするための a と、その個人情報ストアとしての a の、それぞれへのポインターがあります。の「静的」データは、実行時にまだ入力されています (ファイルから読み取られます)。それは一定ではありません!BaseStorageHolderHolderconst BaseStatic*BaseStorage*BaseStatic

ここでの考え方は、多くのインスタンスBaseStatic間で 1:N で共有される特定の読み取り専用データと関数のセットを持つことです。Holderそれぞれには、派生型Holderと一致する必要があるインスタンスに固有の実行時情報もあります。BaseStaticそれがBaseStorage派生物が行うことであり、BaseStatic型が必要とする特定の実行時情報を保持します。 それ自体もデータを格納し、すべての sHolderで同じ機能を持ちます。Holder不活性容器ではありません。

したがってBaseStorage、各派生とペアになった派生が必要BaseStaticです。これらの派生ペアが多数存在します。

struct BaseStorage
{
 int something[2];
};

struct BaseStatic
{
 typedef BaseStorage Storage;

 //members and stuff
};


struct DerivedStorage : public BaseStorage
{
 std::string somethingelse;
};

struct DerivedStatic : public BaseStatic
{
 typedef DerivedStorage Storage;

 //other things
};


struct Holder
{
 const BaseStatic* base;
 BaseStorage* storage;
};

私はいくつかのことを行うビルダー関数を持っています。私が考えることができる唯一の方法は、次のようにテンプレートを使用することです。

template<typename T> Holder& builder(const T* base) //receives a BaseStatic
{
 Holder& holder = ...;

 //add to a list, etc

 holder.base = base;
 holder.storage = new T::Base();
}

ただし、これにより、非常に些細なこと (単一の型へのアクセス!) のために、多くのテンプレート化された関数がコンパイラによって作成されることになります。さらに、T::Base コンストラクターのパラメーターを持つことはできません (すべての構造体が同じものを持っていない限り!)。これは別の意味でもひどいと思います。

BaseStaticテンプレートを使用せずに仮想的にアクセスできる型を格納する方法はありますか? もっといい方法があるに違いない。

この設定に至ったのにはさまざまな制約があるため、見苦しくなってしまったら申し訳ありません。

4

2 に答える 2

0

Raymond Chen のコメントを使用して、BaseStatic次のメソッドを作成しました。

Storage* CreateStorage() const {return new Storage();}

そしてそれを次のようにオーバーライドしますDerivedStatic:

Storage* CreateStorage() const {return new Storage();}
于 2013-11-07T17:16:42.730 に答える