Как избежать повторяющихся длинных общих ограничений в Rust

Я пытаюсь сделать свою собственную реализацию больших целых чисел (только для образования). Реализация является общей по типу данных:

struct LongNum<T>
where T: Integer + MulAssign + CheckedMul + CheckedAdd + Copy + From<u8>
{
    values: Vec<T>,
    powers: Vec<u8>,
    radix: u8,
}

Проблема в том, что мне нужно повторить это подробное ограничение для T во всех имплсах. Это слишком громоздко.

Я могу создать свою собственную черту, комбинируя эти ограничения, например так:

trait LongNumValue: Integer + MulAssign + CheckedMul + CheckedAdd + Copy + From<u8> {}

struct LongNum<T: LongNumValue>
{
    values: Vec<T>,
    powers: Vec<u8>,
    radix: u8,
}

Но в этом случае я должен добавить impls для этой черты LongNumValue ко всем типам, которые могут использоваться в LongNum:

impl LongNumValue for u8 {}
impl LongNumValue for u16 {}
impl LongNumValue for u32 {}
...

Это означает, что если я не добавлю какой-либо тип в этот список impls, пользователь моего ящика не сможет использовать этот тип для LongNum, даже если этот тип проходит все ограничения.

Есть ли способ избежать написания длинных повторяющихся затрат без добавления ненужных ограничений для пользователя?

Ответ 1

Вы можете добавить общую реализацию:

impl<T> LongNumValue for T 
where
    T: Integer + MulAssign + CheckedMul + CheckedAdd + Copy + From<u8> {}