Предположим, у меня есть тип A
без конструктора по умолчанию:
struct A
{
int x;
A(int x) : x(x) {}
};
Я хочу сделать std::array
из A
. Я могу легко сделать это с помощью списка инициализаторов:
std::array<A, 5> arr = { 0, 1, 4, 9, 16 };
Здесь вы можете увидеть закономерность. Да, у меня может быть функция генератора для вычисления каждого значения массива:
int makeElement(size_t i)
{
return i * i;
}
std::array<A, 5> arr = {
makeElement(0),
makeElement(1),
makeElement(2),
makeElement(3),
makeElement(4)
};
И да, на самом деле у меня гораздо больше 5 элементов (а именно 64). Так что было бы неплохо не повторять makeElement
64 раза. Единственное решение, которое я придумал, - использовать вариативные шаблоны для распаковки пакета параметров в список инициализаторов: https://ideone.com/yEWZVq (также проверяет, правильно ли удалены все копии). Это решение было вдохновлено этим вопросом < / а>.
Это работает, но я бы хотел не злоупотреблять вариативными шаблонами для такой простой задачи. Вы знаете, раздувание исполняемого файла, замедление компиляции и все такое. Я хотел бы сделать что-то вроде этого:
- Создайте неинициализированное хранилище подходящего размера
- Инициализируйте все элементы в цикле с размещением
new
- Волшебным образом преобразуйте хранилище в
std::array
и верните его
Я могу сделать несколько грязных хаков, чтобы реализовать это в динамической памяти: https://ideone.com/tbw5lm Но это не лучше std::vector
, где у меня вообще таких проблем нет.
И я понятия не имею, как я могу это сделать в автоматической памяти. Т.е. иметь ту же удобную функцию, возвращающую std::array
по значению, со всем этим скрытым за капотом. Любые идеи?
Полагаю, что boost::container::static_vector
может быть для меня хорошим решением. К сожалению, я не могу использовать boost
для этой конкретной задачи.
PS. Обратите внимание, что этот вопрос больше похож на исследовательский интерес. В реальном мире и вариативные шаблоны, и std::vector
будут работать нормально. Я просто хочу знать, может быть, я что-то упускаю.
constexpr
не повлияет на размер исполняемого файла. Что касается замедления компиляции, что ж, добро пожаловать на C ++. - person Sam Varshavchik   schedule 18.06.2016