从泛型内部类型派生所有转换运算符

问题描述 投票:0回答:1

我正在尝试使用新类型模式,但我希望它仅具有语义含义,而不强制表示。那么我们就说吧

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>;
的实现冲突,因此无法编译。我怎样才能绕过这个限制?

generics rust metaprogramming wrapper
1个回答
0
投票

你无法绕过限制(尽管有一个不稳定的提案用于专业化实现,我不确定它在这种情况下是否有效)。但是:你也不需要绕过它。

您可以只为

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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.