从构造函数参数列表创建 std::array<T, N>



所需的行为是emplace调用N次。

与此问题非常相似,初始化一个具有常数值的std::数组。除了没有在给定一些T的情况下调用复制构造函数,而是为您提供了一些参数列表,您可以为其调用T的相应构造函数。

伪代码:

template <typename ...Args>
std::array<T, N> create_array(Args&&... args)
{
return { T(args...), T(args...), .... };
}

例如,当T的成员是(智能(指针并且您希望这些指针引用唯一对象时,这是必要的。

Jarod评论说,这应该用一个获取索引的生成器来实现,而使用c++20模板化的lambdas,我们可以取消辅助函数

template <std::size_t N, typename Generator>
auto make_array(Generator gen)
{
return [&]<std::size_t... I>(std::index_sequence<I...>) -> std::array<std::decay_t<decltype(gen(std::size_t{}))>, N>
{
return { {(gen(I))...} };
}(std::make_integer_sequence<std::size_t, N>{});
}

https://godbolt.org/z/5qGbYWjEh

修改这个答案,我得出了:

namespace detail
{
template <typename T, std::size_t ... Is, typename ...V>
constexpr std::array<T, sizeof...(Is)>
create_array(std::index_sequence<Is...>, V&&... values)
{
// cast Is to void to remove the warning: unused value
return { {(static_cast<void>(Is), T(values...))...} };
}
}
template <typename T, std::size_t N, typename ...V>
constexpr std::array<T, N> create_array(V&&... values)
{
return detail::create_array<T>(std::make_index_sequence<N>(), std::forward<V>(values)...);
}

最新更新