首页  >  文章  >  后端开发  >  如何在 C 中使用非默认可构造类型优雅地初始化 `std::array` ?

如何在 C 中使用非默认可构造类型优雅地初始化 `std::array` ?

Susan Sarandon
Susan Sarandon原创
2024-10-27 20:17:01934浏览

 How to Elegantly Initialize `std::array` with Non-Default Constructible Types in C  ?

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

在 C 领域, std::array ;提供了一种处理固定大小数组的便捷方法。然而,在处理缺少默认构造函数的类型时,初始化数组中的元素会带来挑战。

考虑以下代码片段:

<code class="cpp">template<typename T, int N>
void f(T value)
{
    std::array<T, N> items = {value, value, value, value, value};
}</code>

虽然简单,但手动重复该值会变得乏味,因为N 增加。为了解决这个问题,一种更优雅的方法是利用 C 17 的结构化绑定和可变参数模板。

利用序列生成器和重复函数

这种优雅的关键解决办法在于生成一个序列类型的seq使用 genseq_t<>发电机。有了这个序列类型,我们可以定义一个重复函数,它接受一个值和生成的序列作为参数,并返回一个 std::array 。填充重复值。

示例实现

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

模式详细信息

  • genseq_t< ;N>::type 表示从 0 到 N-1 的序列类型。
  • repeat(value, seq) 计算结果为一个 std::array每个元素都初始化为值。

此技术允许对 std::array 进行简洁而优雅的初始化。即使 T 缺少默认构造函数。

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

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