rust - 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);
}
上面的代码将屏蔽位图。在上面的例子中,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++ 的东西吗?
解决方案
不,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 建议添加它。
也可以看看:
对于您的具体情况,我会改用特征:
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);
推荐阅读
- c# - .NET 事务、Mongo DB、2 阶段提交与单阶段提交
- java - 如何在特定文件扩展名打开时启动 Java 应用程序或与现有 Java 进程通信?
- sql - Oracle 查询 - 按城市划分的年度人口趋势
- python-unittest - 在 Python 2.7 中通过 unittest.TestCase 模拟 datetime.now()
- machine-learning - pytorch 如何通过 argmax 反向传播?
- apache - xampp-control“开始”操作按钮运行 httpd.exe 但不会更新控制窗口
- django - Django Q 查找返回在两个模型中都找到的重复项
- python - 'gi.repository.GObject' 对象在执行 cx_freeze 构建的包时没有属性'threads_init'
- mysql - springboot mysql + jpa 通讯链接失败
- r - 提取两个字符之间的部分文本字符串