如何在 Rust 中获得通用枚举的原始表示?

Sjo*_*ers 6 generics enums repr traits rust

我有一个读取位并创建枚举的函数。目前,调用者需要提供 EnumType 和该枚举的表示形式。如何更改函数,以便从 EnumType 推导出表示形式,以便调用者只需要提供 EnumType 而不是其表示形式?

// Example enum:
use num_enum::TryFromPrimitive;
#[derive(Debug, Clone, Copy, TryFromPrimitive)]
#[repr(u8)]
pub enum VehicleType {
    Boat = 0,
    Car = 1,
}

// Example of current functional call
extract_enum_bits::<VehicleType, u8>(&data, 2, 6);

// Current function:
fn extract_enum_bits<EnumType: std::convert::TryFrom<Repr>, Repr: ReadInto>(data: &[u8],start_bit: u64, bits_to_read: u8) -> EnumType
where <EnumType as std::convert::TryFrom<Repr>>::Error : std::fmt::Debug {
    let enum_as_repr_int = extract_bits::<Repr>(&data, start_bit, bits_to_read);
    EnumType::try_from(enum_as_repr_int).unwrap()
}
Run Code Online (Sandbox Code Playgroud)

想要的函数调用语法:

extract_enum_bits::<VehicleType>(&data, 2, 6)
Run Code Online (Sandbox Code Playgroud)

如何更改函数 extract_enum_bits 以支持这种新的调用语法?

或者以不同的方式提出问题。如何在问号处获取枚举表示类型(在本例中为 u8),同时满足最后一行“::try_from”施加的“std::convert::From”要求?

pub fn extract_enum_bits<EnumType: TryFromPrimitive>(data: &[u8],start_bit: u64, bits_to_read: u8) -> EnumType {
    let enum_as_repr_int = extract_bits::< ???? >(&data, start_bit, bits_to_read);
    EnumType::try_from(enum_as_repr_int).unwrap()
}
Run Code Online (Sandbox Code Playgroud)