首页 > 后端开发 > C++ > 正文

如何使用模板元编程优雅地初始化非默认可构造 std::array?

Linda Hamilton
发布: 2024-10-28 04:59:01
原创
762 人浏览过

How to Initialize Non-Default Constructible std::array Elegantly with Template Metaprogramming?

优雅地初始化非默认可构造 std::array

在 C 中使用非默认可构造类型时,初始化 std::array 可能具有挑战性,尤其是当数组大小由模板参数确定时。

为了解决这个问题,我们引入了一种利用序列类型和生成器概念的复杂方法:

序列类型 seq

我们使用模板元函数定义一个名为 seq 的序列类型,它表示连续整数的序列。

<code class="cpp">template<int ... N>
struct seq
{
   using type = seq<N...>;
   static const std::size_t size = sizeof ... (N);
   template<int I>
   struct push_back : seq<N..., I> {};
};</code>
登录后复制

生成器 genseq

使用这个序列,我们构造一个生成器 genseq 来生成长度递增的序列:

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

template<>
struct genseq<0> : seq<> {};

template<int N>
using genseq_t = typename genseq<N>::type;</code>
登录后复制

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
   //note that (X, value) evaluates to value
   return {(N, value)...}; 
}</code>
登录后复制

用法

要初始化非默认可构造类型的 std::array,我们只需使用所需的值和 genseq_t:

<code class="cpp">template<typename T, int N>
void f(T value)
{
     //genseq_t<N> is seq<0,1,...N-1>
     std::array<T, N>> items = repeat(value, genseq_t<N>{});
}</code>
登录后复制
该方案保证了 std::array 优雅高效的初始化,有效消除了 n 为较大模板参数时繁琐的手动重复操作。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!