у меня есть
struct Val<U, const OFS: u8, const LEN: u8> {
value: U,
}
Эта «группа типов» может быть любого типа OFS:0..255, LEN:0..255 для U, Итак, 65536 различных типов на U.
Я хочу иметь возможность связывать BitOr любой экземпляр этой «группы типов» друг с другом.
Вот мой пример тестового примера:
#![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,
}
/// BitOr for u16
impl<const OFS: u8, const LEN: u8> BitOr for Val<u16, OFS, LEN> {
type Output = u16;
fn bitor(self, rhs: Self) -> Self::Output {
self.value << OFS | rhs.value << OFS
}
}
///
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);
}
Ошибка компиляции ошибка [E0308]: несовпадающие типы в пусть v = v_1 | v_2;
Я понимаю, что T_1
и T_2
— это разные типы.
Итак, как я могу использовать BitOr для этих разных типов?
Признак BitOr имеет параметр типа Rhs
(который по умолчанию равен Self
, если опущен). В этом случае вы хотите предоставить другой экземпляр типа Val
:
impl<const OFSA: u8, const LENA: u8, const OFSB: u8, const LENB: u8> BitOr<Val<u16, OFSB, LENB>>
for Val<u16, OFSA, LENA>
{
type Output = u16;
fn bitor(self, rhs: Val<u16, OFSB, LENB>) -> Self::Output {
self.value << OFSA | rhs.value << OFSB
}
}
Вы правы, моя тестовая строка должна быть «assert_eq!(0b0101, v);»
Чтобы удовлетворить
assert_eq!(0b0011, v);
, вы хотите использоватьOFSA
для обоихvalue
в реализации. Но это зависит от того, какая именно семантика требуется.