如何使用默认值初始化通用常量长度的数组?

我想在 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(),
        }
    }
}

游乐场链接


以上是如何使用默认值初始化通用常量长度的数组?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>