我正在尝试创建一个通用的结构体,其中使用“整数类型”引用数组。出于性能考虑,我希望能够轻松地指定是使用
u16
、u32
还是u64
。像这样(显然不是有效的Rust代码):struct Foo<T: u16 or u32 or u64> { ... }
有没有办法表达这个意思?
u16
、u32
还是u64
。像这样(显然不是有效的Rust代码):struct Foo<T: u16 or u32 or u64> { ... }
有没有办法表达这个意思?
通常情况下,将引用存储到数组中只需使用usize
而不是其他整数类型。
但是,为了实现您想要的功能,您可以创建一个新的特征,将该特征实现为u16
、u32
和u64
,然后将T限制为您的新特征。
pub trait MyNewTrait {}
impl MyNewTrait for u16 {}
impl MyNewTrait for u32 {}
impl MyNewTrait for u64 {}
struct Foo<T: MyNewTrait> { ... }
您可以在MyNewTrait
上添加方法,以及impl
来封装特定于u16
、u32
和u64
的逻辑。
enum Unsigned {
U16(u16),
U32(u32),
U64(u64),
}
struct Foo { x: Unsigned, ... };
struct Foo([Unsigned; 1_000_000]);
如果存储一百万个u16
会浪费大量空间,你仍然可以将Foo
设置为通用类型!只需实现From<u16>
、From<u32>
和From<u64>
来支持Unsigned
,然后按照以下方式编写:
struct Foo<T: Into<Unsigned>>([T; 1_000_000]);
T
进行一个简单的特质约束,不必浪费空间来存储标签和填充,并且处理 T
的函数可以始终将其转换为 Unsigned
以进行计算。转换的成本甚至可以被完全优化掉。num
crate已经为您完成了这项工作:https://docs.rs/num/latest/num/traits/trait.Unsigned.html - Anonyme2000
pub trait MyNewTrait: Add<Output = Self> + Mul<Output = Self> + ... {}
- Matthieu M.Into<usize>
。可以是T: MyNewTrait + Into<usize>
或trait MyNewTrait : Into<usize>
。 - Lukazoid