Rust中商环类型模值一致性编译期检查实现方案咨询
可以通过 Rust 的**常量泛型(Const Generics)**实现该需求,这个特性从 Rust 1.59 版本开始稳定,功能对应你提到的 C++ template<auto n> 特性,可以把模值作为类型的一部分,在编译期直接校验两个操作数的模是否一致。
修改后的实现代码如下:
use std::ops; // 模M作为const泛型参数,成为类型的一部分 #[derive(Debug, PartialEq)] struct Quot<const M: usize, T> { v: T, } impl<const M: usize, T> ops::Add for &Quot<M, T> where T: ops::Rem<Output = T> + ops::Add<Output = T> + Copy + From<usize>, { type Output = Quot<M, T>; fn add(self, other: Self) -> Self::Output { // 不需要运行时判断模是否相等,泛型约束已经保证两个操作数的M完全相同 Quot { v: (self.v + other.v) % T::from(M), } } } pub fn main() { let x = &Quot::<19, _> { v: 12 }; let y = &Quot::<19, _> { v: 10 }; let z = &Quot::<7, _> { v: 5 }; println!("{:?}", x + y); // 编译通过,输出 Quot { v: 3 } // 下面这行取消注释会直接编译报错:类型不匹配,预期Quot<19, _>,找到Quot<7, _> // println!("{:?}", x + z); }
补充说明:
- 如果需要让模的类型和值的类型保持一致,Rust 1.79 及以上版本支持更灵活的 const 泛型参数类型,可以将结构体定义调整为
struct Quot<T, const M: T>,仅需注意 T 必须是 Rust 允许作为 const 泛型参数的原始数值类型即可。 - 常量泛型仅支持处理编译期已知的常量值,如果你的模值是运行时动态生成的,无法在编译期确定,还是需要使用原来的运行时校验方案。
内容的提问来源于stack exchange,提问作者FiatLux
相关产品推荐
相关产品推荐

