使用不同的值初始化const容器的正确方法是什么?

时间:2016-08-16 12:29:08

标签: c++ c++11 initialization const

我有一些容器struct,它包含一组配置元素。

struct config
{
    const std::vector<int> config_items;
    const std::vector<double> another_items;
}

另外,我有一个“容器容器”,它应该容纳这些配置容器的已知和有限数量的实例(例如3)。然后,每个config实例应在相应的int中具有不同的doublevector

struct setup
{
    const std::vector<config> items;
}

所有vector s项都应为const,因为它们应定义一次且永不改变。

由于vectorconst,我只能在构造函数初始化列表中初始化它们。但我希望有多个具有不同值的实例。

我可以创建一些子struct来在子构造函数中创建每个配置。但这不起作用,因为我无法在子构造函数中初始化父成员:

struct config_1 : public config
{
    config_1() : config_items { 1, 2 }, another_items { 1.0, 2.0 } {} // Doesn't work
}

这似乎也是一个非常糟糕的决定(删除const,制作副本......):

struct config
{
    std::vector<int> config_items;    
    std::vector<double> another_items;    
}

struct setup
{
    std::vector<config> items;
}

void init()
{
    config c;
    c.config_items = { 1, 2 };
    c.another_items = { 1.0, 2.0 };

    setup s;
    s.items = { c };
}

我也不能创建一个初始化列表构造函数,因为我有多个vector s:

struct config
{
    config(std::initializer_list<int> i, std::initializer_list<double> d); // No go
    std::vector<int> config_items;    
    std::vector<double> another_items;    
}

背景:我希望我的嵌入式应用程序有一个硬编码的const配置结构(可能放在DATA部分,甚至放在闪存中)。无需从任何配置文件中读取内容等。

所以我的问题是:你会建议我如何创建这样的const配置容器?

修改

这里std::vector实际上是错误的。我正在使用一个自定义容器来保存实例中的数据,如std::array,而不是像std::vector那样在堆上分配存储。

所以环境应该是这样的:

struct config
{
    const std::array<int, 2> config_items;
    const std::array<double, 2> another_items;
}

struct setup
{
    const std::array<config, 3> items;
}

1 个答案:

答案 0 :(得分:0)

经过一番研究后,我决定回答我自己的问题。

提到 NathanOliver nwp 时,问题中使用的std::vector会分配堆上的内存。实际上,我正在使用类似于std::array的自定义容器来保存实例本身的数据。

所以我应该在问题中写出这样的内容:

struct config
{
    const std::array<int, 2> config_items;
    const std::array<double, 2> another_items;
}

struct setup
{
    const std::array<config, 3> items;
}

现在,由于这些structnet/rpc,我可以使用encoding/gob个:{/ p>

setup instance
{
    // std::array c++11-ish double-braces aggregate initialization
    // this is the items member
    { {
        {
            // this is the config_items member
            { { 1, 2 } },

            // this is the another_items member
            { { 1.0, 2.0 } },
        },

        {
            { { 3, 4 } },
            { { 3.0, 4.0 } },
        },

        {
            { { 5, 6 } },
            { { 5.0, 6.0 } },
        }
    } }
};

现在,我有一个初始化的instance结构,其成员为const,没有运行时代码进行初始化(没有ctors,没有方法调用),而是原始数据将是直接存储在DATA部分(默认情况下)。这正是我所需要的。