gpt4 book ai didi

c++ - 当元素的成员为 const 时,在编译时初始化 std::array。自定义 to_array 实现

转载 作者:行者123 更新时间:2023-12-02 01:24:40 24 4
gpt4 key购买 nike

在编译时,我想从另一个 constexpr 静态数组创建一个静态数组。

如果只有数组元素类型的成员不是const,我下面的尝试才会奏效。

new_foo_arr[idx] = Foo{
error: use of deleted function 'Foo& Foo::operator=(Foo&&)'

错误是合理的,但 std::to_array 可以以某种方式创建 const 元素。我在初始化数组时发现的答案是使用 lambda,但这在这里没有任何区别。

struct FooConfig {
const std::string_view name;
};

struct Foo {
const std::string_view name;
const unsigned index;
void* owner;
};

inline constexpr std::array foo_config = std::to_array<const FooConfig>(
{{ .name = "A", },
{ .name = "B", },
{ .name = "C", },});

template<const decltype(foo_config)& arr>
consteval auto make_foo_array()
{
std::array<Foo, arr.size()> new_foo_arr{};
for (auto idx = 0u; idx < arr.size(); ++idx)
{
auto cfg = arr[idx];
new_foo_arr[idx] = Foo{
.name = std::string_view(cfg.name),
.index = idx,
.owner = nullptr,
};
}
return new_foo_arr;
}

inline auto foo_array = make_foo_array<foo_config>();

有什么办法可以欺骗编译器吗? new_foo_array 无论如何都是临时的,那么为什么会有这么大的阻力?

最佳答案

默认构造const成员的Foo数组后不需要赋值,可以使用index_sequence构造 Foo 直接数组:

template<const decltype(foo_config)& arr>
consteval auto make_foo_array()
{
return []<std::size_t... Is>(std::index_sequence<Is...>) {
return std::array{
Foo{.name = std::string_view(arr[Is].name), .index = Is, .owner = nullptr}...};
}(std::make_index_sequence<arr.size()>{});
}

Demo

关于c++ - 当元素的成员为 const 时,在编译时初始化 std::array。自定义 to_array 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75063752/

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