我有一组类,我正在使用 CRTP 扩展它们以执行 mixin 样式,以便每种类型都可以具有单独的静态成员变量。所有的类都继承自 GdsDataObject。有 36 个独立的类执行此操作,并且它们没有统一的类混合。这是一个名为 GdsAircraft 的类之一的示例。
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
{
...
}
在运行时,我从文件加载配置选项并使用这些值设置静态成员变量。现在我使用一个循环来检测该选项的数据类型,然后调用一个或多个模板函数来分配值。我必须为具有额外 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
}
}
我想用一个模板函数来完成这一切,而不是为每个 mixin 编写一个单独的函数并手动跟踪哪些类有哪些 mixin。单个函数应该能够以某种方式为实际具有这些变量的类设置静态变量。