0%

怎么用常量值初始化std::array?

❓ 我需要使用const值初始化std::array的所有元素,就像使用std::vector一样。

1
2
3
4
5
6
7
8
#include 
#include

int main()
{
std::vector<int> v(10, 7); // OK
std::array<int, 10> a(7); // does not compile, pretty frustrating
}

有没有办法优雅地做到这一点?现在我正在使用这个:

1
2
3
std::array<int, 10> a;
for (auto & v : a)
v = 7;

但我想避免使用显式代码进行初始化。


✔️ 使用std::index_sequence,您可以执行以下操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace detail
{
template <typename T, std::size_t ... Is>
constexpr std::arraysizeof...(Is)>
create_array(T value, std::index_sequence)
{
// cast Is to void to remove the warning: unused value
return {{(static_cast<void>(Is), value)...}};
}
}

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

随着使用

1
auto a = create_array<10 /*, int*/>(7); // auto is std::array

std::fill解决方案相反,它处理非默认的可构造类型。