В Rust предположим, что у меня есть следующая структура:
struct Wrapper<T> {
t: T,
}
Я хотел бы реализовать черту From
, чтобы можно было конвертировать из Wrapper<T>
в Wrapper<U>
(всякий раз, когда преобразование из T
до U
поддерживается). Например, я хотел бы иметь преобразование из Wrapper<u16>
в Wrapper<u32>
.
Я пробовал это:
impl<T, U> From<Wrapper<T>> for Wrapper<U>
where U: From<T>
{
fn from(w: Wrapper<T>) -> Self {
Self(w.t.into())
}
}
Но это не с:
error[E0119]: conflicting implementations of trait `std::convert::From<Wrapper<_>>` for type `Wrapper<_>`:
...
= note: conflicting implementation in crate `core`:
- impl<T> std::convert::From<T> for T;
Я понимаю, почему я получаю ошибку, но мне интересно, есть ли способ добиться того, чего я хочу?
До сих пор я создал макрос и использовал его, чтобы обеспечить определенные c реализации для всех целочисленные примитивные типы, но я бы хотел, чтобы мое решение было более обобщенным c.