Привет всем. Есть желание поговорить об aggregate и list инициализацииях и о том, как их подружить.
Дана структура, которая выглядит примерно так:
template <typename T, size_t N>
struct Array
{
T data[N];
};
ну или так (в контескте данного топика эти определения полностью равнозначны):
template <typename T, size_t N>
struct Array
{
std::array<T,N> data;
};
Эта структура поддерживает агрегатную инициализацию и может быть проинициализирована, например, вот так:
Array<int, 10> array { 0, 1, 2, 3, 4, /* 5, 6, 7, 8, 9 */ }; // Обратите внимание на возможность неполной спецификации
Этот тип позволяет создавать вложенные структуры данных и по-прежнему поддерживает агрегатную инициализацию, например:
Array<Array<Array<int, 3>, 3>, 3> table { 0, 1, 2, /*....*/};
Теперь задача в том, чтобы сделать член
data закрытым и предоставить конструкторы для этого класса так, чтобы форма инициализации не изменилась. Ну или изменилась, но как-нибудь разумно. Например, меня бы устроило, если бы инициализация вложенных структур данных выглядела бы так:
Array<Array<int, 3>, 3> table { { 11, 12, 13 }, { 21, 22, 23 }, { 31, 32, 33 }};
Но это уже опционально — если сохранится вид, присущий агрегатной инициализации, меня бы это вполне устроило.
Короче говоря, вот в этом примере:
https://ideone.com/SxpvxR нужно сделать член
data закрытым.
| Чего НЕ хотелость бы получить |
| так это необходимость указывать типы элементов явно:
Array<Array<int, 3>, 3> table { Array<int, 3>{ 11, 12, 13 }, Array<int, 3>{ 21, 22, 23 }, Array<int, 3>{ 31, 32, 33 }};
|
| |