我的代码看起来像:
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]
}
};
}
但是我必须将类型传递给宏才能完成这项任务。是否有类似于C++中可以使用的decltype()
的东西?
mem::size_of_val($bitmap)
代替mem::size_of::<$ty>()
,并且使用~0
代替<$ty>::MAX
(因为你的宏只对无符号整数类型有意义),那么你可以删除所有类型实例。 - Jmbmem::size_of_val()
会被任何优化在编译时解释吗? 我以前尝试过你说的方法。mem::size_of()
是一个const函数,因此它会在编译时解决,但我不确定size_of_val
。 - Mihir Luthrasize_of_val
与size_of::<T>()
相同,除非在编译时无法确定T
的大小,在这种情况下它将在运行时计算,而size_of::<T>()
则无法编译。 - Jmb