Rust 是否有相当于 C++ 的 decltype() 的函数来获取表达式的类型?

2023-11-27

我的代码如下所示:

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 is保留关键字,以便将来可能允许这样做:

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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust 是否有相当于 C++ 的 decltype() 的函数来获取表达式的类型? 的相关文章

随机推荐