Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 动态存储内部配置_C++_Design Patterns_Configuration - Fatal编程技术网

C++ 动态存储内部配置

C++ 动态存储内部配置,c++,design-patterns,configuration,C++,Design Patterns,Configuration,我一直在考虑用R存储程序内部配置的正确方法 详情如下: 该配置仅在运行时生成,因此每次运行时都会生成。 可以对其进行修改,并应通过项目文件中的指令进行修改。读取该文件不在本问题的范围内 它需要是可扩展的,即应该有一种方法添加带有赋值的新变量。 我的问题是: 我应该如何开始呢?是一个 使用访问器和设置器初始化 使用的内部std::map 自定义变量是一个好的选择吗? 有什么已知的好方法吗 为什么要这样做? 两者之间应该有区别吗 整数、布尔值和字符串 配置变量? 有什么区别吗 在用户和内置之间 我已

我一直在考虑用R存储程序内部配置的正确方法

详情如下:

该配置仅在运行时生成,因此每次运行时都会生成。 可以对其进行修改,并应通过项目文件中的指令进行修改。读取该文件不在本问题的范围内 它需要是可扩展的,即应该有一种方法添加带有赋值的新变量。 我的问题是:

我应该如何开始呢?是一个 使用访问器和设置器初始化 使用的内部std::map 自定义变量是一个好的选择吗? 有什么已知的好方法吗 为什么要这样做? 两者之间应该有区别吗 整数、布尔值和字符串 配置变量? 有什么区别吗 在用户和内置之间 我已经存在了 想到这些变量了吗? 谢谢

PS:如果问题不清楚,请随时询问更多信息


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

您可能会做得比某种属性映射更糟。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
};

您可能会做得比某种属性映射更糟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
};
你可以用这个

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

你可以用这个

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


在配置文件中支持嵌套非常有用。差不多

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

我还没查过,据我所知,boost property map可以做到这一点


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

支持在配置文件中嵌套非常有用。差不多

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

我还没查过,据我所知,boost property map可以做到这一点

可以将所有值存储为字符串或字符串数组,以便仅在访问时将其转换为目标类型