2011-01-13 64 views
1

我一直在考虑The Right Way (R)来存储我的程序的内部配置。动态存储内部配置

下面是详细信息:

  • 的配置仅在运行,所以产生的每次运行。
  • 它可以通过一个“项目”文件中的指令进行调整(也应该)(该文件的阅读是不是在这个问题的范围)
  • 它必须是可扩展的,即应该有办法用assignes值添加新的“变量”。

我这个问题:

  1. 我应该如何与这个开始?是 类访问器和设置器 与内部std::map为 自定义变量一个很好的选择?
  2. 是否有任何已知的和“好”的方式 这样做?
  3. 整数,布尔值和字符串 配置变量之间应该有什么区别吗?
  4. 用户和内置的 (我已经在 之前已经存在)变量是否应该在所有 之间有所不同?

谢谢!

PS:如果问题不明确,请随时索取更多信息。

UPDATE:哇,每个答案似乎有隐式或明确使用的提升。我应该提到我想避免提升(我现在想要探索标准库的功能)。

回答

1

你可以做的比某种属性映射的恶化(StringMap只是一个typedef定义的std ::地图)

class PropertyMap 
{ 
private: 
    StringMap m_Map; 

public: 
    PropertyMap() { }; 
      ~PropertyMap() { }; 

    // properties 
    template<class T> 
    T get(const String& _key, const T& _default = T()) const 
    { 
     StringMap_cit cit(m_Map.find(_key)); 
     return (cit != m_Map.end()) ? boost::lexical_cast<T>(cit->second) : _default; 
    }; // eo get 

    // methods 
    void set(const String& _cap, const String& _value) 
    { 
     m_Map[_cap] = _value; 
    }; // eo set 

    template<class T> 
    void set(const String& _key, const T& _val) 
    { 
     set(_key, boost::lexical_cast<String>(_val)); 
    }; // eo set 
}; 
3

您可以使用Boost.PropertyTree这一点。

属性树是多功能数据 结构,但特别是 适合保存配置数据。 该树提供了它自己的, 树特定的接口,并且每个节点 也是一个STL兼容序列,用于 其子节点。

0

支持在配置文件中嵌套非常有用。像JSON

作为参数值可以是标量,数组和参数嵌套组,它可以被存储在一个的boost::variantstd::map,其值可以是标量,阵列或其他std::map递归。请注意,std::map按名称排序,因此如果参数的原始配置文件顺序很重要,那么也应该有一个顺序的参数索引。这可以通过使用boost::multi_index以快速查找的有序索引或散列索引和以原始配置文件顺序遍历参数的顺序索引来实现。

我还没有检查过,那种提升房产地图可以做到这一点,从我听到的。

可以将所有值存储为字符串(或数组值的字符串数组),只有在访问它时将其转换为目标类型。