От документация из std::array
мы находим, что он может быть инициализирован следующим образом (используя агрегатную инициализацию):
struct S {
S(): arr{0,1} { }
std::array<int,2> arr;
};
В любом случае, проблема возникает в этом случае:
template<int N>
struct S {
S(): arr{/*??*/} { }
std::array<int,N> arr;
};
Как можно инициализировать массив при создании s
(как пример со значениями из 0
в N-1
или используя constexpr
функция ed, к которой нужно передать индексы)?
Вот огромная недоиспользуемая сила std::iota
:
template <int N>
struct S {
S() {
std::iota(arr.begin(), arr.end(), 0);
}
std::array<int, N> arr;
};
Хотя, если вы действительно хотите использовать агрегатную инициализацию, всегда есть std::integer_sequence
(требуется C ++ 14, но на SO есть много решений C ++ 11):
template <int N>
struct S {
S() : S(std::make_integer_sequence<int, N>{}) {}
std::array<int, N> arr;
private:
template <int... Is>
S(std::integer_sequence<int, Is...> )
: arr{Is...}
{ }
};
Других решений пока нет …