Инициализировать std :: массив std :: array - PullRequest
0 голосов
/ 22 мая 2018

У меня есть и std::array из std::array, и я говорю, что хочу инициализировать все массивы {1,2,3}.Мы пишем:

std::array<std::array<int,3>,3> x{{1,2,3},{1,2,3},{1,2,3}};

Это не очень удобно.Это становится очень грязно, когда у вас есть более 3 массивов, или каждый массив имеет более 3 элементов.

Однако, это становится еще хуже, если размер массива не известен a priori :

template <size_t n, size_t T> struct foo{
  std::array<std::array<int,n>,T> x;
}

Как вы можете инициализировать x?Чтобы было понятнее, я бы хотел инициализировать все массивы в x массивом определенного заданного параметра.То есть что-то вроде:

template <size_t n, size_t T> struct foo{
  static constexpr int N{20};

  std::array<std::array<int,n>,T> x;

  foo() : x{ {N,N,...}, {N,N,...}, ...} {}
}

(если бы это было возможно).Любое предложение или идеи?Я всегда могу перебрать x и вызвать метод fill, как в следующем фрагменте кода:

for (size_t idx = 0; idx < x[0].size(); idx++)
  x[idx].fill(N);

Но это не инициализация, верно?Я новичок в использовании std::array, и я не знаю, спрашиваю ли я здесь что-то пустое: /

1 Ответ

0 голосов
/ 22 мая 2018

С std::index_sequence вы можете сделать что-то вроде:

template <std::size_t ... Is, typename T>
constexpr std::array<T, sizeof...(Is)>
make_array(const T& value, std::index_sequence<Is...>)
{
    return {{(void(Is), value)...}};
}

template <std::size_t N, typename T>
constexpr std::array<T, N> make_array(const T& value)
{
    return make_array(value, std::make_index_sequence<N>());
}

, а затем:

template <size_t n, size_t T>
struct foo{
    static constexpr int N{20};

    std::array<std::array<int,n>,T> x;

    foo() : x{make_array<T>(make_array<n>(N))} {}
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...