首页 >后端开发 >C++ >如何优雅地初始化非默认可构造类型的 std::array ?

如何优雅地初始化非默认可构造类型的 std::array ?

Patricia Arquette
Patricia Arquette原创
2024-10-30 09:53:27602浏览

How to Initialize `std::array` for Non-Default Constructible Types Elegantly?

std::array 的优雅初始化对于非默认可构造类型

在这种情况下,当包含的类型 (T) 缺少默认构造函数时,初始化 std::array 可能是一个挑战。常见的解决方案是手动重复值来填充数组,对于较大的 n 值来说,这是一个乏味且容易出错的过程。

幸运的是,存在一种更优雅的方法,使用序列类型和自定义重复函数的组合。考虑以下代码:

<code class="cpp">template<typename T, int N>
void f(T value)
{
    // Generate a sequence of numbers: 0, 1, ..., N-1
    using genseq_t = genseq_t<N>;
    std::array<T, N> items = repeat(value, genseq_t{});
}</code>

genseq_t type 表示从 0 到 N-1 的数字序列,repeat 函数接受一个值和一个序列,返回一个填充该值的数组。

repeat 函数的实现包括解包序列并重复该值对于每个元素,使用简洁的语法:

<code class="cpp">template<typename T, int...N>
auto repeat(T value, seq<N...>) -> std::array<T, sizeof...(N)>
{
    // Unpack N, repeating 'value' sizeof...(N) times
    return {(N, value)...};
}</code>

使用push_back操作递归地定义genseq_t类型以创建序列:

<code class="cpp">template<int N>
struct genseq : genseq<N - 1>::type::template push_back<N - 1> {};</code>

自定义序列和重复函数提供了灵活的以及初始化 std::array 的优雅解决方案具有非默认的可构造类型。

以上是如何优雅地初始化非默认可构造类型的 std::array ?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn