提问人:Dekakaruk 提问时间:9/26/2023 最后编辑:cafce25Dekakaruk 更新时间:9/28/2023 访问量:65
从泛型内部类型派生所有转换运算符
Derive all convertion operators from generic inner type
问:
我正在尝试使用新类型模式,但我希望它只有语义意义,而不强制表示。所以让我们说
struct Amount<T>(T);
所以以后我可以使用 or – 两者都在语义上有效,内部类型将仅取决于上下文。但现在我想从内部类型继承所有转换运算符: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>;
答:
0赞
Max Meijer
9/28/2023
#1
您无法绕过该限制(尽管有一个不稳定的专业化实现建议,我不确定它在这种情况下是否有效)。但是:你也不需要绕过它。
您可以只实现 的特征,然后在 的实现中简单地使用它。然后,因为会有一个开箱即用的实现。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)
}
}
评论
Amount<T>
T
serde
num
From