如何使用默认值初始化通用常量长度的数组?
我想在 struct A 中初始化数组,但数组的长度是一个 const 泛型。虽然我可以确保长度总是小于 32,但似乎当前的编译器不支持这一点。此外,我尝试了#![feature(const_evaluatable_checked)],它有效,但此功能已从最新的编译器中删除。你有什么想法?
#![feature(const_generics)]
struct B<E>
where
E: Copy + Default,
{
f: E,
}
struct A<E, const ITEM_NUM: usize>
where
E: Copy + Default,
{
array: [Option<Box<B<E>>>; ITEM_NUM],
}
impl<E, const ITEM_NUM: usize> A<E, ITEM_NUM>
where
E: Copy + Default,
{
fn new() -> Self {
Self {
array: Default::default(),
}
}
}
fn main() {
let aa = A::<i32, 12>::new();
}
PS 我不知道我是否可以使用泛型数组,因为 B 结构也需要 E 泛型。
回答
由于 const 泛型仍然很新而且Default很旧,所以它只为长度小于 32 的数组实现。 解决这个问题的最简单方法是添加一个强制数组实现的边界Default,并且在将来这样Default为所有长度的数组实现,代码仍然有效:
impl<E, const ITEM_NUM: usize> A<E, ITEM_NUM>
where
E: Copy + Default,
// require that the array implements Default
[Option<Box<B<E>>>; ITEM_NUM]: Default,
{
fn new() -> Self {
Self {
array: Default::default(),
}
}
}
游乐场链接