Как обеспечить примитивный тип привязки? - PullRequest
0 голосов
/ 31 мая 2018

Я хотел бы принудительно установить примитивный тип, связанный с универсальным типом, чтобы следующий код работал:

struct Wrapper<T> {
    value: T,
}

impl<T> Wrapper<T> {
    fn method(&self) -> u32 {
        self.value as u32
    }
}

fn main() {
    let wrapper = Wrapper { value: 10 as u16 };
    println!("{}", wrapper.method());
}

Эта проблема похожа на Существует ли черта только для примитивных типов, которую яможно использовать в обобщенной функции? за исключением того, что здесь мы можем вывести на основе типов, будет ли преобразование успешным или нет.

Компилятор предлагает использовать черту From:

error[E0605]: non-primitive cast: `T` as `u32`
 --> src/main.rs:7:9
  |
7 |         self.value as u32
  |         ^^^^^^^^^^^^^^^^^
  |
  = note: an `as` expression can only be used to convert between primitive types. Consider using the `From` trait

Это будет сводиться к реализации From для каждого возможного примитивного типа, верно?Есть ли обходной путь для этого?

Я столкнулся с этой проблемой, когда пытался реализовать битовый итератор для примитивных типов:

struct BitIterator<T> {
    value: T,
    pos: usize,
}

impl<T> BitIterator<T> {
    fn new(value: T) -> BitIterator<T> {
        //Accept up 32 bit for now
        assert!(std::mem::size_of::<T>() <= 4);
        BitIterator { value, pos: 0 }
    }
}

impl<T> Iterator for BitIterator<T> {
    type Item = u32;

    fn next(&mut self) -> Option<Self::Item> {
        if self.pos >= std::mem::size_of::<T>() * 8 {
            return None;
        }
        let res = Some((self.value as u32 >> self.pos) & 1);
        self.pos += 1;
        res
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...