如何优雅用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
相关产品推荐
相关产品推荐

