在运行时分配CRTP静态成员

时间:2013-09-07 18:11:45

标签: c++ templates static-members crtp

我有一组类,我使用CRTP进行扩展,以使每个类型都有单独的静态成员变量。所有类都继承自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编写单独的函数,并手动跟踪哪些类具有哪些mixins。单个函数应该能够以某种方式为实际具有这些变量的类设置静态变量。

0 个答案:

没有答案