我想将一个u64值转换为一个通用的数字类型,如下所示
fn f<T: AppropriateTrait>(v: u64) -> T {
v as T
}并且它的行为在语义上类似于,例如259u64 as u8,也就是说,它应该只占用最不重要的位。不幸的是,FromPrimitive::from_u64函数返回一个Option<T>,如果输入值不合适,则返回None。
这里起作用的是:
fn f<T: FromPrimitive + Int + ToPrimitive>(v: u64) -> T {
T::from_u64(v & T::max_value().to_u64().unwrap()).unwrap()
}但它非常冗长和不雅。有更好的办法吗?
编辑:我只对转换成整数类型感兴趣,如u8、u16等,没有古怪的东西。
发布于 2015-03-13 12:41:29
一种特别有效的方法是定义你自己的特质,并给出你想要的效果;特别是当你要做更复杂的事情时,这通常是你想要的(尽管肯定不是总是如此)。在这种情况下,您可能会选择这样的方法:
trait FromU64 {
fn from_u64(v: u64) -> Self;
}
macro_rules! impl_from_u64 {
($($ty:ty)*) => {
$(
impl FromU64 for $ty {
#[inline]
fn from_u64(v: u64) -> $ty {
v as $ty
}
}
)*
}
}
impl_from_u64!(u8 u16 u32 u64 usize);您最初的f::<T>将是<T as FromU64>::from_u64,或者是
fn f<T: FromU64>(v: u64) -> T {
FromU64::from_u64(T)
}https://stackoverflow.com/questions/29025811
复制相似问题