我正在尝试使用新类型模式,但我希望它仅具有语义含义,而不强制表示。那么我们就说吧
struct Amount<T>(T);
所以稍后我可以使用
Amount<i32>
或 Amount<f64>
– 两者在语义上都是有效的,并且内部类型仅取决于上下文。但现在我想从内部类型继承所有转换运算符:
impl<T, U: From<T>> TryFrom<Amount<T>> for Amount<U> {
type Error = U::Error;
fn try_from(v: Amount<T>) -> Self {
v.0.try_into().map(Self)
}
}
由于与
impl<T, U> TryFrom<U> for T where U: Into<T>;
的实现冲突,因此无法编译。我怎样才能绕过这个限制?
你无法绕过限制(尽管有一个不稳定的提案用于专业化实现,我不确定它在这种情况下是否有效)。但是:你也不需要绕过它。
您可以只为
Into<T>
实现 Amount<T>
特征,然后简单地在 TryFrom<U>
的 U : Into<T>
实现中使用它。然后从 Amount<T> : Into<T>
开始,就会有一个 TryFrom<Amount<T>>
开箱即用的实现。
impl<T> Into<T> for Amount<T> {
type Error = U::Error;
fn into(v: Amount<T>) -> T {
v.0
}
}
impl<T, U : Into<T>> TryFrom<U> for Amount<T> {
type Error = U::Error;
fn from(v: U) -> Self {
v.into().map(Self)
}
}