从另一个 std::array 的引用初始化 std::array 的每个元素

问题描述 投票:0回答:2

我有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
的组合可能是正确的方向。

c++ reference initialization stdarray
2个回答
0
投票
auto Bs = std::apply([](auto&... args){ return std::array{B{args}...}; }, As);

0
投票

不幸的是,解决方案并不是那么简单,因为做到这一点的唯一方法就是您已经做过的:

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>{});
© www.soinside.com 2019 - 2024. All rights reserved.