我正在try 自己实现大整数(只是为了教育).根据数据类型,实现是通用的:
struct LongNum<T>
where T: Integer + MulAssign + CheckedMul + CheckedAdd + Copy + From<u8>
{
values: Vec<T>,
powers: Vec<u8>,
radix: u8,
}
问题是我需要在所有impl中对T重复这个冗长的约束.太麻烦了.
结合这些约束条件,我可以创造自己的trait ,比如:
trait LongNumValue: Integer + MulAssign + CheckedMul + CheckedAdd + Copy + From<u8> {}
struct LongNum<T: LongNumValue>
{
values: Vec<T>,
powers: Vec<u8>,
radix: u8,
}
但在这种情况下,我必须将这个LongNumValue特性的impl添加到所有可以在LongNum中使用的类型中:
impl LongNumValue for u8 {}
impl LongNumValue for u16 {}
impl LongNumValue for u32 {}
...
这意味着,如果我不向这个impl列表添加一些类型,我的 crate 的用户将无法将这个类型用于LongNum,即使这个类型通过了所有约束.
有没有什么方法可以避免编写长时间重复的costraints,而不给用户增加不必要的限制?