我有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
的新手,我不知道我是否在这里问一些虚假的东西:/
答案 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))} {}
};