У меня есть класс списка, в котором переменная размера является членом const
. Это полезно для меня, потому что применяет требование, согласно которому размер списка может варьироваться от запуска к запуску, но не может изменяться в рамках отдельного запуска.
Я хотел бы создать коллекцию этих списков. Количество списков в коллекции является переменной шаблона, поэтому я хотел бы использовать std::array
... т.е. мне нужен массив списков, где размер массива является параметром шаблона, а размер каждого list - это const
, указанный при построении
К сожалению:
- Список const-size не имеет конструктора по умолчанию (его размер должен быть указан!), поэтому мне нужно указать аргумент конструктора для каждого элемента списка. Я не могу просто создать массив, а затем установить элементы
- Поскольку размер моего списка является переменной шаблона, я не могу использовать стандартный список инициализаторов — количество требуемых элементов варьируется.
Я понимаю, что есть альтернативы:
- Я мог бы использовать
std::vector
и простоpush_back
элементы один за другим, пока размер вектора не сравняется с параметром моего шаблона, но это кажется неэлегантным, потому что это не будет естественным образом обеспечивать условие, согласно которому размер результирующего вектора не должен изменяться после он полностью заселен. - Я мог бы изменить порядок индексов и получить список
std::arrays
константного размера. Однако это не очень хорошо сочетается с остальной частью моего кода; Я хотел бы иметь возможность передавать отдельный список константного размера из массива в клиентский код. - Я мог бы создать конструктор по умолчанию для класса списка постоянного размера, создать массив, а затем использовать новое размещение для замены элементов массива один за другим. Похоже, это может иметь некоторые плохие побочные эффекты (что делает конструктор по умолчанию для списка const-size? Что, если он случайно вызывается в другом месте? Что происходит, когда мой преемник понятия не имеет, что я сделал?)
Поскольку ни один из них не является полностью идеальным, я думаю, что было бы здорово, если бы существовал конструктор массива (или вспомогательная функция), который принимал бы в качестве аргументов:
- Количество элементов в массиве T
- Один объект T
... и вернуть std::array<T>
, где каждый T
был создан методом копирования из аргумента 2.
Существует ли такая вещь?
std::array<T,N>
с самого начала. - person WhozCraig   schedule 03.04.2016