gpt4 book ai didi

c++ - 您可以动态生成初始化列表吗?

转载 作者:行者123 更新时间:2023-12-02 09:50:52 25 4
gpt4 key购买 nike

我有一个没有默认构造函数的MyClass类,我想创建一个std::array<MyClass, 8>。我相信我可以像这样初始化我的数组:

std::array<MyClass, 8> my_array = {
{arg00, arg01, /* ... */, arg0N},
{arg10, arg11, /* ... */, arg1N},
/* ... */
{arg70, arg71, /* ... */, arg7N}
};

其中 argij是第i个元素的构造函数(第8个)的第j个参数(在N中)。现在,阐明这些参数是一件无聊且容易出错的事情,并且自动生成/组装它们的过程更加清晰,直接,这可以通过以下方式完成:
for(uint8_t a = 0; a < 2; ++a) {
for(uint8_t b = 0; b < 2; ++b) {
for(uint8_t c = 0; c < 2; ++c) {
std::tie(arg0, arg1, /* ... */, argN) = generate_args(a, b, c);

/* TODO: do something with arg0, arg1 ... argN */
}
}
}

所以,问题是:有没有办法从动态生成的构造函数参数创建 std::array<MyClass, 8> my_array;

编辑:

目前,我在 MyClass上具有默认构造函数,因此可以从循环内部初始化 my_array[counter++] = MyClass(args...);。但是我不喜欢允许在未初始化状态下创建 MyClass

最佳答案

不,您不能使用类似的初始化列表。但是您可能可以从std::experimental::to_array()借用一个把戏,并使用std::index_sequence模板转换合适的 vector :

template <std::size_t... I>
static constexpr std::array<MyClass, 8>
to_array(std::vector<MyClass>&& v, std::index_sequence<I...>)
{
return { {v[I]...} };
}


const std::array<MyClass, 8> my_array =
[]{
std::vector<MyClass> v;
for(uint8_t a = 0; a < 2; ++a) {
for(uint8_t b = 0; b < 2; ++b) {
for(uint8_t c = 0; c < 2; ++c) {
int arg0, arg1, arg2, arg3;
std::tie(arg0, arg1, arg2, arg3) = generate_args(a, b, c);
v.emplace_back(arg0, arg1, arg2, arg3);
}
}
}
return to_array(std::move(v), std::make_index_sequence<8>{});
}();

如果您的 MyClass是不可复制或不可移动的,则可以使用类似的索引序列模板直接构造到数组中(但从索引中生成 abc):
template <std::size_t... I>
constexpr std::array<MyClass, 8>
generate(std::index_sequence<I...>)
{
auto create =
[](std::size_t i) {
const auto& [arg0, arg1, arg2, arg3]
= generate_args((i>>2)&1, (i>>1)&1, (i>>0)&1);
return MyClass{arg0, arg1, arg2, arg3};
};
return { create(I)... };
}


const std::array<MyClass, 8> my_array = generate(std::make_index_sequence<8>{});

关于c++ - 您可以动态生成初始化列表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59631480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com