为同U的不同Val<const参数>类型实现BitOr trait的方法
解决不同const泛型参数的
Val类型间的BitOr实现问题 你的问题核心在于当前的BitOr实现仅支持相同const参数的Val实例操作,而Val<u16,0,1>和Val<u16,1,2>是完全不同的类型,因此编译器报错类型不匹配。要实现同一U类型下任意OFS/LEN组合的Val实例间的按位或,需要为BitOr实现跨const参数的泛型逻辑。
修正方案
修改BitOr的实现,引入独立的const泛型参数来接收右侧操作数的OFS和LEN,而非限制为与左侧相同的参数:
#![allow(non_camel_case_types)] #![allow(unused_imports)] #![allow(unused_variables)] #![allow(dead_code)] use core::ops::BitOr; /// a value, at offset with length #[derive(Debug)] struct Val<U, const OFS: u8, const LEN: u8> { value: U, } // 实现跨不同OFS/LEN的BitOr操作 impl<const OFS_LHS: u8, const LEN_LHS: u8, const OFS_RHS: u8, const LEN_RHS: u8> BitOr for Val<u16, OFS_LHS, LEN_LHS> { type Output = u16; fn bitor(self, rhs: Val<u16, OFS_RHS, LEN_RHS>) -> Self::Output { // 分别使用各自的偏移量位移后按位或 (self.value << OFS_LHS) | (rhs.value << OFS_RHS) } } fn main() { type T_1 = Val<u16, 0, 1>; let v_1 = T_1 { value: 0b0001 }; type T_2 = Val<u16, 1, 2>; let v_2 = T_2 { value: 0b0010 }; let v = v_1 | v_2; assert_eq!(0b0011, v); println!("v_1 = {:?}", v_1); println!("v_2 = {:?}", v_2); println!("v = {:?}", v); }
关键说明
- 这里为左侧
Val<u16, OFS_LHS, LEN_LHS>实现BitOr,右侧操作数允许是任意Val<u16, OFS_RHS, LEN_RHS>类型,打破了原实现中左右类型必须完全一致的限制。 - 方法逻辑中,分别使用各自的
OFS参数对value进行位移,再执行按位或,符合你对不同偏移量值合并的需求。 - 如果需要支持更多
U类型(如u32、u64),可以将实现改为通用版本,只要U实现Shl<u8, Output=U>和BitOr<Output=U>即可:
use core::ops::{BitOr, Shl}; impl<U, const OFS_LHS: u8, const LEN_LHS: u8, const OFS_RHS: u8, const LEN_RHS: u8> BitOr for Val<U, OFS_LHS, LEN_LHS> where U: Shl<u8, Output = U> + BitOr<Output = U> + Copy, { type Output = U; fn bitor(self, rhs: Val<U, OFS_RHS, LEN_RHS>) -> Self::Output { (self.value << OFS_LHS) | (rhs.value << OFS_RHS) } }
内容的提问来源于stack exchange,提问作者xjn xjn
相关产品推荐
相关产品推荐

