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);