在C/ c++中使用enum作为枚举范围外值的整数?

  • 本文关键字:范围 枚举 整数 c++ enum rust
  • 更新时间 :
  • 英文 :


假设我有以下C enum:

enum TokenType {
Identifier = 256,
KeywordFunc = 257,
KeywordReturn = 258,
KeywordIf = 259,
KeywordElse = 260
};

枚举从256开始,所以我可以使用字符的文字ascii值,当我喜欢TokenType type = TokenType('{');时,我如何在Rust中实现类似的东西?我现在有:

pub enum TokenType {
Identifier,
KeywordFunc,
KeywordReturn,
KeywordIf,
KeywordElse,
}
pub enum TokenTypeUnion {
Ascii(char),
NoneAscii(TokenType)
}

但也许有一个更习惯的解决方案?

为了简化使用,我只是将结构稍微扁平化一下:

pub enum TokenType {
Ascii(char),
Identifier,
KeywordFunc,
KeywordReturn,
KeywordIf,
KeywordElse,
}
fn use_enum() {
let token = TokenType::Ascii('}');
let token = TokenType::Return;
}

除了我看不出你的方法有什么改进的地方之外,它很地道。

您可以这样实现From特性:

pub enum TokenType {
Identifier,
KeywordFunc,
KeywordReturn,
KeywordIf,
KeywordElse,
Ascii(char),
}
impl From<TokenType> for u16 {
fn from(tok_type: TokenType) -> u16 {
match tok_type {
TokenType::Identifier       => 256,
TokenType::KeywordFunc      => 257,
TokenType::KeywordReturn    => 258,
TokenType::KeywordIf        => 259,
TokenType::KeywordElse      => 260,
TokenType::Ascii(char)      => char as u16,
}
}
}
fn main() {
println!("{}", u16::from(TokenType::KeywordElse));  // 260
println!("{}", u16::from(TokenType::Ascii('}')));   // 125
}

最新更新