我有一些容器struct
,它包含一组配置元素。
struct config
{
const std::vector<int> config_items;
const std::vector<double> another_items;
}
另外,我有一个“容器容器”,它应该容纳这些配置容器的已知和有限数量的实例(例如3)。然后,每个config
实例应在相应的int
中具有不同的double
和vector
。
struct setup
{
const std::vector<config> items;
}
所有vector
s项都应为const
,因为它们应定义一次且永不改变。
由于vector
是const
,我只能在构造函数初始化列表中初始化它们。但我希望有多个具有不同值的实例。
我可以创建一些子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;
}
答案 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;
}
现在,由于这些struct
是net/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部分(默认情况下)。这正是我所需要的。