在 C 中使用非默认可构造类型时,初始化 std::array 可能具有挑战性,尤其是当数组大小由模板参数确定时。
为了解决这个问题,我们引入了一种利用序列类型和生成器概念的复杂方法:
我们使用模板元函数定义一个名为 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 来生成长度递增的序列:
<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() 函数来创建使用相同值初始化的数组:
<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?的详细内容。更多信息请关注PHP中文网其他相关文章!