Внедрить признак BitOr для «группы типов»

у меня есть

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 для этих разных типов?

Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
0
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Признак 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!(0b0011, v);, вы хотите использовать OFSA для обоих value в реализации. Но это зависит от того, какая именно семантика требуется.

cafce25 28.08.2024 12:48

Вы правы, моя тестовая строка должна быть «assert_eq!(0b0101, v);»

xjn xjn 29.08.2024 08:40

Другие вопросы по теме