You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优雅用std::array<A,N>元素引用初始化std::array<B,N>?

问题描述

我定义了如下类:

class A {

};

以及类B:

class B {
public:
    explicit B(A &a) : aRef(a) {}
private:
    A &aRef;
};

首先初始化一个A类型的std::array:

std::array<A, 2> As{};

现在我想用As中的每个元素初始化一个B类型的std::array,当前写法是:

std::array<B, 2> Bs{B{As[0]}, B{As[1]}};

该写法可行,但随着数组尺寸增大,可读性下降,且需要借助脚本生成代码。我希望直接得到B类型的数组(而非std::unique_ptr<B>数组),猜测结合模板与std::index_sequence是可行方向,请问是否有更优雅的实现方式?

解决方案

可以利用**模板元编程结合std::index_sequence**实现自动初始化,无需手动逐个编写元素构造代码,核心是通过编译期索引序列展开,自动遍历原数组元素并构造对应B对象。

实现代码

#include <array>
#include <utility>

class A {};

class B {
public:
    explicit B(A &a) : aRef(a) {}
private:
    A &aRef;
};

// 编译期辅助函数:通过索引序列展开构造B数组
template <size_t... Idx>
std::array<B, sizeof...(Idx)> make_B_array_impl(std::array<A, sizeof...(Idx)> &arr, std::index_sequence<Idx...>) {
    return {{B{arr[Idx]}...}};
}

// 对外调用接口:推导数组大小并生成对应索引序列
template <size_t N>
std::array<B, N> make_B_array(std::array<A, N> &arr) {
    return make_B_array_impl(arr, std::make_index_sequence<N>{});
}

// 使用示例
int main() {
    std::array<A, 5> As{};
    auto Bs = make_B_array(As); // 自动生成对应大小的B数组
    return 0;
}

关键说明

  • std::make_index_sequence<N>会在编译期生成0到N-1的索引序列,传递给辅助函数后,通过参数包展开B{arr[Idx]}...自动生成每个B的构造代码。
  • 整个过程完全在编译期完成,没有运行时开销,和手动编写构造代码的效率一致。
  • 无论数组尺寸如何变化,只需调用make_B_array(As)即可得到对应大小的std::array<B, N>,无需修改核心逻辑。

内容的提问来源于stack exchange,提问作者zsliu98

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:36:06