CRTP を使用して mixin スタイルを実行するように拡張しているクラスのセットがあり、各タイプが個別の静的メンバー変数を持つことができます。すべてのクラスは GdsDataObject を継承しています。これを行う 36 の個別のクラスがあり、それらには統一されたクラスの mixin がありません。これは、GdsAircraft という名前のクラスの 1 つの例です。
template <typename T>
class GdsMixinLOD
{
protected:
static unsigned int min_lod;
static unsigned int max_lod;
}
template <typename T> unsigned int GdsMixinLOD<T>::min_lod = 10;
template <typename T> unsigned int GdsMixinLOD<T>::max_lod = 1000;
class GdsAircraft :
public GdsDataObject,
public GdsMixinLOD<GdsAircraft>,
public GdsMixinShared<GdsAircraft> // Mixin shared by all classes
{
...
}
実行時に、ファイルから構成オプションを読み込み、それらの値を使用して静的メンバー変数を設定します。現在、ループを使用してオプションの対象となるデータ型を検出し、1 つ以上のテンプレート関数を呼び出して値を割り当てています。追加の mixin を持つクラスに対して追加の関数を手動で呼び出す必要があります。
template<typename GdsType_T>
void setGdsStaticConfigLODValues(const OptionTokens &options)
{
for(auto &data_type_option : options) {
if(data_type_option.first == "MIN_LOD") {
GdsType_T::min_lod = boost::lexical_cast<unsigned int>(options.second);
} else if(data_type_option.first == "MIN_LOD") {
GdsType_T::min_lod = boost::lexical_cast<unsigned int>(options.second);
}
}
}
template<typename GdsType_T>
void setGdsStaticConfigSharedValues(const OptionTokens &options)
{
for(auto &data_type_option : options) {
// Loop just like in setGdsStaticConfigLODValues function
}
}
ミックスインごとに個別の関数を作成し、どのクラスにどのミックスインがあるかを手動で追跡するのではなく、単一のテンプレート関数でこれらすべてを実行したいと考えています。単一の関数は、実際にそれらの変数を持つクラスの静的変数を何らかの形で設定できるはずです。