Rust는 표현식의 유형을 얻기 위해 C ++의 decltype ()과 동등한 것이 있습니까?

Nov 18 2020

내 코드는 다음과 같습니다.

macro_rules! mask {
    ($bitmap: tt, [..$count: tt], for type = $ty: ty) => { { let bit_count = std::mem::size_of::<$ty>() * 8;
            let dec_bit_count = bit_count - 1;
            $bitmap & [(1 << ($count & dec_bit_count)) - 1, <$ty>::MAX][((($count & !dec_bit_count)) != 0) as usize]
        }
    };
}

fn main() {
    let bitmap: u8 = 0b_1111_1111;
    let masked_bitmap = mask!(bitmap, [..5], for type = u8);
    println!("{:#010b}", masked_bitmap);
}

위의 코드는 비트 맵을 마스킹합니다. 위의 예에서, 0b_1111_1111에 의해 마스킹되고 상 [..5]해질 것이다 0b_0001_1111.

내 매크로가 다음과 같기를 바랍니다.

macro_rules! mask {
    ($bitmap: tt, [..$count: tt]) => {
        {
            let bit_count = std::mem::size_of::<decltype($bitmap)>() * 8; let dec_bit_count = bit_count - 1; $bitmap & [(1 << ($count & dec_bit_count)) - 1, <decltype($bitmap)>::MAX][((($count & !dec_bit_count)) != 0) as usize]
        }
    };
}

그러나이 작업을 수행하려면 매크로에 유형을 전달해야합니다. decltype()내가 사용할 수있는 C ++ 와 같은 것이 있습니까?

답변

4 Shepmaster Nov 18 2020 at 13:45

아니요, Rust는 임의의 표현식 유형을 가져올 수 없습니다. typeof 이다 잠재적으로 미래에이를 수 있도록 예약 된 키워드 :

fn main() {
    let a: i32 = 42;
    let b: typeof(a) = a;
}
error[E0516]: `typeof` is a reserved keyword but unimplemented
 --> src/main.rs:3:12
  |
3 |     let b: typeof(a) = a;
  |            ^^^^^^^^^ reserved keyword

추가 할 것을 제안하는 RFC가 있습니다.

또한보십시오:

  • Rust 매크로에서 표현식 유형을 어떻게 일치 시키나요?
  • 함수 서명 또는 선언을 위해 구조체 멤버 유형에 액세스 할 수 있습니까?
  • 구체적인 유형의 바인딩을 얻기위한 .type '— 문제 # 2704

특정 경우에는 대신 특성을 사용합니다.

use std::ops::RangeTo;

trait Mask {
    fn mask(self, range: RangeTo<usize>) -> Self;
}

impl Mask for u8 {
    #[inline]
    fn mask(self, range: RangeTo<usize>) -> Self {
        // Feel free to make this your more complicated bitwise logic
        let mut m = 0;
        for _ in 0..range.end {
            m <<= 1;
            m |= 1;
        }
        self & m
    }
}


fn main() {
    let bitmap: u8 = 0b_1111_1111;
    let masked_bitmap = bitmap.mask(..5);
    println!("{:#010b}", masked_bitmap);
}

그러나 매크로를 사용 하여 특성구현할 수 있습니다 .

macro_rules! impl_mask {
    ($($typ:ty),*) => {
        $( impl Mask for $typ {
                #[inline]
                fn mask(self, range: RangeTo<usize>) -> Self {
                    let mut m = 0;
                    for _ in 0..range.end {
                        m <<= 1;
                        m |= 1;
                    }
                    self & m
                }
            }
        )*
    };
}

impl_mask!(u8, u16, u32, u64, u128);