инициализация агрегата std :: array и целочисленные типы шаблонов

От документация из 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, к которой нужно передать индексы)?

2

Решение

Вот огромная недоиспользуемая сила 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...}
{ }
};
4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector