【发布时间】:2020-11-18 09:59:15
【问题描述】:
我的代码如下:
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,则可以删除该类型的所有实例(因为无论如何您的宏只对无符号整数类型有意义)。 -
@Jmb,
mem::size_of_val()是否会在编译时被任何优化解释?我试过你之前说的。mem::size_of()是 const func 所以它会在编译时得到解决,但我不确定size_of_val。 -
根据the docs,
size_of_val与size_of::<T>()相同,除非在编译时无法知道T的大小,在这种情况下,它会在运行时进行评估,而size_of::<T>()编译失败。 -
Godbolt 显示 it is optimized at compile time.
标签: rust