初始化std :: array的std :: array

时间:2018-05-22 16:31:29

标签: c++ arrays initialization

我有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 :(得分:1)

使用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))} {}
};