我有A级:
class A {
};
还有另一个B类:
class B {
public:
explicit B(A &a) : aRef(a) {}
private:
A &aRef;
};
我首先初始化一个数组A:
std::array<A, 2> As{};
现在我想初始化一个 B 数组,其中每个元素都用 A 的元素初始化:
std::array<B, 2> Bs{B{As[0]}, B{As[1]}};
这个有效。但随着数组大小的增加,可读性降低,我必须使用另一个脚本来打印代码。有更优雅的方法吗?
将
Bs
声明为 std::unique_ptr<B>
数组即可。但是,我直接想要一个 B
数组。我认为模板和std::index_sequence
的组合可能是正确的方向。
auto Bs = std::apply([](auto&... args){ return std::array{B{args}...}; }, As);
不幸的是,解决方案并不是那么简单,因为做到这一点的唯一方法就是您已经做过的:
std::array<B, 2> Bs{B{As[0]}, B{As[1]}};
但是我们可以使用模板元编程来概括每个可能的数组大小:
std::array<B, N> = [&]<std::size_t... I>(std::index_sequence<I...>) {
return std::array<B, N>{ As[I]... };
}(std::make_index_sequence<N>{});