list vs aggregate initialization
От: rg45 СССР  
Дата: 01.03.18 19:45
Оценка:
Привет всем. Есть желание поговорить об 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 }};
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 01.03.2018 20:17 rg45 . Предыдущая версия . Еще …
Отредактировано 01.03.2018 20:15 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.