Rust 是否有等价于 C++ 的 decltype() 来获取表达式的类型?



我的代码看起来像:

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

上面的代码将屏蔽位图。在上述示例中,被[..5]掩蔽的0b_1111_1111将变为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]
}
};
}

但我必须将类型传递给宏才能完成此操作。有没有像C++中的decltype()这样的东西我可以使用?

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

最新更新