Можно ли передать точный список инициализации в скобках конструктору std::array
? Это может быть необходимо, поскольку std::array
не поддерживает назначение списка инициализаторов.
Попытка адаптировать принятый ответ на этот вопрос: Как построить std:: объект массива со списком инициализаторов? (сокращенная ссылка ответа: https://stackoverflow.com/a/6894191/4385532 ) к моей проблеме, я придумал следующее «решение» проблемы передачи скобочного списка инициализации конструктору std::array
:
template<class T, std::size_t N> struct ArrayWrapper
{
std::array<T,N> arr;
ArrayWrapper(T &&... init) : arr{{std::forward<T>(init)...}} {}
}
Я надеялся, что это позволит использовать следующий синтаксис:
int main()
{
ArrayWrapper<int, 4> aw{{1,2,3,4}};
std::cout << aw.arr[2] << '\n';
}
Однако я потерпел неудачу. Это не скомпилируется: http://ideone.com/VJVU1X
Я не уверен, в чем моя ошибка. Я надеялся, что эта строка
ArrayWrapper(T &&... init) : arr{{std::forward<T>(init)...}} {}
будет захватывать точные элементы списка init-list, переданного в конструктор ArrayWrapper
, и перенаправлять их в конструктор std::array
.
Что я не понимаю?
T &&... init
— это расширение пакета, которое не содержит пакета, поэтому оно не будет работать. - person cpplearner   schedule 15.11.2016std::array
является агрегатом — у него нет имеет конструктора, и я не уверен, какая документация заставила вас поверить, что он будет. Это может быть необходимо, посколькуstd::array
не поддерживает назначение списка инициализаторов. Итак? То есть, почему вы считаете это проблемой? - person ildjarn   schedule 15.11.2016ArrayWrapper<int, 4> aw({1,2,3,4});
?ArrayWrapper<int, 4> aw(1,2,3,4);
приемлемо? Как насчетArrayWrapper<int, 4> aw({{1,2,3,4}});
? Это сильно пахнет проблемой XY... - person ildjarn   schedule 15.11.2016std::array
синтаксис. Согласно en.cppreference.com/w/cpp/concept/SequenceContainer# cite_note-1std::array
должен поддерживать назначение init-list в фигурных скобках, то есть такой синтаксис:std::array<int, 4> arr({1,2,3,4});
. Посколькуstd::array
поддерживает этот синтаксис, я хочу, чтобы моя оболочка также поддерживала этот синтаксис. - person   schedule 15.11.2016ArrayWrapper(T const(&a)[N]) { std::copy(a, a+N, arr.data()); }
разрешил бы такой синтаксис, но у меня нет идея, если она действительно имеет семантику, которую вы хотите... - person ildjarn   schedule 15.11.2016