BaseStorage
さまざまな実行時データを格納する struct と、(または派生した) typedef と、変更されず、 struct の複数のインスタンスから読み取られる「静的」データを保持する structがありBaseStatic
ます。 には、その読み取り専用の共有データにアクセスするための a と、その個人情報ストアとしての a の、それぞれへのポインターがあります。の「静的」データは、実行時にまだ入力されています (ファイルから読み取られます)。それは一定ではありません!BaseStorage
Holder
Holder
const 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
テンプレートを使用せずに仮想的にアクセスできる型を格納する方法はありますか? もっといい方法があるに違いない。
この設定に至ったのにはさまざまな制約があるため、見苦しくなってしまったら申し訳ありません。