动态存储内部配置

时间:2011-01-13 19:19:40

标签: c++ design-patterns configuration

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

以下是详细信息:

  • 配置仅限运行时,因此每次运行都会生成。
  • 它可以通过“项目”文件中的指令进行调整(并且应该)(该文件的读取不在本问题的范围内)。
  • 它需要是可扩展的,即应该有一种方法来添加具有assignes值的新“变量”。

我对此有疑问:

  1. 我该怎么做呢?是一个 带有访问器和setter的类 内部std::map用于 自定义变量是一个不错的选择吗?
  2. 有没有任何已知和“好”的方式 这样做?
  3. 两者之间应该有区别吗? 整数,布尔值和字符串 配置变量?
  4. 是否应该有所不同 用户和内置之间 (已经存在于我之前 想到他们)变量?
  5. 谢谢!

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

    更新:哇,每个答案似乎都隐含或明确地使用了提升。我应该提到我想避免使用boost(我现在想要探索标准库的功能)。

3 个答案:

答案 0 :(得分:3)

您可以使用Boost.PropertyTree

  

属性树是通用数据   结构,但特别是   适合保存配置数据。   树提供了自己的,   树特定的接口和每个节点   也是STL兼容的序列   它的子节点。

答案 1 :(得分:1)

你可能比某种属性映射更糟糕(StringMap只是一个typedef'd std :: map)

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
};

答案 2 :(得分:0)

支持配置文件中的嵌套非常有用。类似于JSON

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

我没有检查过,提升属性图可以从我所听到的那样做。

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