Как избежать повторяющихся длинных универсальных ограничений в 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 {}
...

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

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

Вы имеете в виду что-то похожее на это? stackoverflow.com/questions/55553281/…

hellow 08.04.2019 10:06
Как создавать пользовательские общие типы в Python (50/100 дней Python)
Как создавать пользовательские общие типы в Python (50/100 дней Python)
Помимо встроенных типов, модуль типизации в Python предоставляет возможность определения общих типов, что позволяет вам определять типы, которые могут...
17
1
1 168
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете добавить полная реализация:

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

Другие вопросы по теме