У меня есть контейнер struct
, который содержит набор элементов конфигурации.Каков правильный способ инициализации контейнеров const с разными значениями?
struct config
{
const std::vector<int> config_items;
const std::vector<double> another_items;
}
Кроме того, у меня есть «контейнер» контейнеры, которые должны проводить известное и ограниченное количество экземпляров этих контейнеров конфигурации (например, 3). Каждый экземпляр config
должен иметь разные int
s и double
s в соответствующем vector
s.
struct setup
{
const std::vector<config> items;
}
все пункты, vector
S'должны быть const
, потому что они должны быть определены один раз и никогда не изменится.
Поскольку vector
s являются const
, я могу инициализировать их только в списке инициализаторов конструктора. Но я хочу иметь несколько экземпляров с разными значениями.
Я мог бы создать дочерний элемент struct
s для создания каждой конфигурации в дочерних конструкторах. Но это не работает, потому что я не могу инициализировать родительский элемент в детском конструкторе:
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
?
EDIT
В std::vector
s фактически здесь не так. Я использую пользовательский контейнер, который хранит данные в экземпляре, например 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;
}
[FYI] векторы являются динамическими, поэтому их необходимо инициализировать во время выполнения. Если вам нужны статические данные, вам следует рассмотреть возможность использования 'std :: array'. – NathanOliver
@NathanOliver, спасибо за этот совет. 'vector' только для простоты здесь, мы используем наши собственные шаблонные контейнеры с внутренним хранилищем данных. – dymanoid