Как построить объект std :: array с именем инициализатора?

Возможный дубликат:
Как инициализировать массив-член с помощью initializer_list?

Вы можете построить std :: array просто отлично с помощью списка инициализаторов:

std::array a = {1, 2, 3}; // works fine 

Однако, когда я пытаюсь построить его из std::initializer_list в качестве элемента данных или базового объекта в classе, он не работает:

 #include  #include  template  struct enum_addressable_array : public std::array { typedef std::array base_t; typedef typename base_t::reference reference; typedef typename base_t::const_reference const_reference; typedef typename base_t::size_type size_type; enum_addressable_array(std::initializer_list il) : base_t{il} {} reference operator[](EnumT n) { return base_t::operator[](static_cast(n)); } const_reference operator[](EnumT n) const { return base_t::operator[](static_cast(n)); } }; enum class E {a, b, c}; enum_addressable_array ea = {'a', 'b', 'c'}; 

Ошибки с gcc 4.6:

 test.cpp: In constructor 'enum_addressable_array::enum_addressable_array(std::initializer_list) [with T = char, unsigned int size = 3u, EnumT = E]': test.cpp:26:55: instantiated from here test.cpp:12:68: error: no matching function for call to 'std::array::array()' test.cpp:12:68: note: candidates are: include/c++/4.6.1/array:60:12: note: std::array::array() include/c++/4.6.1/array:60:12: note: candidate expects 0 arguments, 1 provided include/c++/4.6.1/array:60:12: note: constexpr std::array::array(const std::array&) include/c++/4.6.1/array:60:12: note: no known conversion for argument 1 from 'std::initializer_list' to 'const std::array&' include/c++/4.6.1/array:60:12: note: constexpr std::array::array(std::array&&) include/c++/4.6.1/array:60:12: note: no known conversion for argument 1 from 'std::initializer_list' to 'std::array&&' 

Как я могу заставить его работать, чтобы мой class-shell мог быть инициализирован с помощью списка инициализаторов:

 enum_addressable_array ea = {'a', 'b', 'c'}; 

В std::array<> нет конструктора, который принимает std::initializer_list<> (конструктор списка инициализаторов), и нет специальной поддержки языка для того, что может означать передать std::initializer_list<> для конструкторов classа так что это может сработать. Так что это не удается.

Чтобы он работал, ваш производный class должен улавливать все элементы, а затем пересылать их, шаблон конструктора:

 template enum_addressable_array(E&&...e) : base_t{{std::forward(e)...}} {} 

Обратите внимание, что в этом случае вам понадобится {{...}} потому что в этом месте не работает фигурная скобка (исключая фигурные скобки, как в вашем случае). Это разрешено только в объявлениях вида T t = { ... } . Поскольку std::array<> состоит из структуры, встраивающей необработанный массив, для которой потребуется два уровня брекетов. К сожалению, я считаю, что точная совокупная структура std::array<> не определена, поэтому вам нужно надеяться, что она будет работать на большинстве реализаций.

Поскольку std::array – это структура, которая содержит агрегат (он не является агрегатом и не имеет конструктора, который принимает std::initializer_list ), вы можете инициализировать базовый агрегат внутри структуры с помощью списка инициализаторов, используя синтаксис с двойными скобками, например:

 std::array my_array = {{1, 2, 3, 4}}; 

Обратите внимание, что это не использует std::initializer_list … это просто использует список инициализаторов C ++ для инициализации публично доступного элемента массива std::array .

В std::array нет конструктора, который принимает std::initializer_list . Это хорошо, потому что списки инициализаторов могут быть больше, чем фиксированный размер массива.

Вы можете инициализировать его, проверив, что список инициализаторов не больше размера массива, а затем копирует элементы списка инициализаторов в elems std::array с помощью std::copy .

  • Как определить, инициализирован ли массив в VB6?
  • Как объявить массив, когда я не знаю длину до времени выполнения?
  • Массив размером 0
  • Как определить массив указателей функций в C
  • как разобрать JSONArray в android
  • Как преобразовать массив символов в строку?
  • Как превратить шестнадцатеричную строку в массив без знака?
  • Получите все неединственные значения (то есть: дублировать / более одного вхождения) в массиве
  • Передача непосредственно инициализатора массива параметру метода не работает
  • Получает массив байтов из ByteBuffer в java
  • Как сделать массив массивов в Java
  • Давайте будем гением компьютера.