在许多不同的类型上实现相同的特征也有类似的问题,这是6年前提出的here年前的问题.我也想知道是否有任何关于这方面的更新.
对于我的问题,假设
struct Foo { data: SomeType }
fn convert(num: u128) -> SomeType {
//This function only works on u128 and processes it into some data in a unique way
todo!();
}
//Now we want to create the Foo wrapper using the convert function
impl<T: Into<u128>> From<T> for Foo {
fn from(other: T) -> Self {
Foo{ data: convert(other.into()) }
}
}
这可能是默认的操作方式.但是,如果我想要将特定类型列入黑名单,即使它们实现了Into<u128>
,或者只想将一些类型列入白名单,该怎么办?
假设我们现在想使用i128
,其中不存在<u128 as From<i128>>
,但仍然可以使用as
强制转换将其合理地转换为u128
.下面的实现旨在处理所有原始整数类型,因为所有这些类型都可以使用as
转换为u128
.
//Now there is a problem!
impl<T> From<T> for Foo {
fn from(other: T) -> Foo {
Foo {data: convert(other as u128)}
}
}
这个问题的出现是因为我们的实现与std
中From<T> for T
的一揽子实现之间的冲突.我们没有具体说明任何性状界限.
在这种情况下,您可以简单地使用num
或num_traits
箱中提供的有用特性来将T
绑定到原始整数.
在不使用这种特征界限的情况下,有没有一个宏可以为语法体相同的不同类型的列表生成一组实现?