如何使用Default初始化泛型常量长度的数组



我想初始化结构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();
}

附言:我不知道是否可以使用泛型数组,因为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(),
}
}
}

游乐场链接

最新更新