enum用法小记

本文介绍了一种在C++中优雅地实现枚举类型与整型互相转换的方法,利用枚举类型最后一个成员设置为一个特殊的大数值,确保枚举类型的大小稳定在特定字节数,从而方便进行类型转换。

     enum是大家都比较喜欢用的一种结构,有助提供清晰的逻辑,有点技巧能使其更有用。

 

 

以前经常看到这样的代码,不知其最后的NONE也何用,今天实际碰到时,才知道是多么美妙的技巧啊。

一般的,用int i = b; 这样的写法,肯定是没问题的,显然,在这里 i 等于1,但是,如果我要将int转换为enum值,典型的情况,我用enum做为map的key:

map<em, string> mp;

这样,使用时,我要根据key来获取string,但是这个em可能不是以em的形式出现的,为了扩展性,很可能到你手里就是一个int i 变量,即需要 mp.find(i); 来查找,这样就遇到了这个问题,如何将int转换成enum?

enum之所以称为enum,无非是为了节省内存,加快速度,很可能的,如果一个enum里的元素只有10,20,那么一个字节就够存储表示它了,此时,你用一个int来转成enum就会很麻烦,你可能会想到如果一个int的值一个字节装的下,那么:

em e = (byte)i;

这样应该就可以了,但是实际情况显然更加复杂。你不能保证一种可行的方案是否在其他的编译器上通过,毕竟enum的大小不是你能预见的(根据不同的编译器,以及enum所表示的内容)。

但是,我们却可以人工使他维持在一个稳定的内存大小状态,通过在使用上面的写法,最后的NONE是一个这样的数,0xffffff,这在无符号数中是最大的,一般我们用enum是从0开始的,这样,就表示了整个无符号数的大小。所以这个enum基本是就是一个4字节大小的对象了,反正不会小于4字节,至于大于的情况,我是没遇到。

接着,就可以通过这样:

em e = (em)((DWORD)i);

来将int i 转换成em,将i转为(DWORD)是需要的,考虑到两者表示的数的范围相同。

在不同的编程语言中,`enum`(枚举)的使用方法有所不同,以下是几种常见编程语言中`enum`的使用介绍: ### C语言 在C语言中,`enum`是一个关键字,用于定义枚举数据类型,它是预处理指令`#define`的替代。枚举数据类型描述的是一组整型值的集合,在编译阶段将名字替换成对应的值。示例如下: ```c #include <stdio.h> // 定义一个枚举类型 enum game {win, lose, tie}; int main() { // 使用枚举常量 enum game result = win; if (result == win) { printf("You win!\n"); } return 0; } ``` 在这个例子中,`win`的值默认是0,`lose`的值是1,`tie`的值是2 [^2][^3]。 ### C++ C++中`enum`的使用和C语言类似,不过有更多的灵活性。示例如下: ```cpp #include <iostream> // 定义一个枚举类型 enum game {win, lose, tie}; int main() { // 使用枚举常量 game result = win; if (result == win) { std::cout << "You win!" << std::endl; } return 0; } ``` 同样,`win`的值默认是0,`lose`的值是1,`tie`的值是2。也可以手动指定枚举常量的值,例如: ```cpp #include <iostream> // 定义一个枚举类型,手动指定值 enum weekday {mon = 1, tue, wed, thu, fri, sat, sun}; int main() { // 使用枚举常量 weekday today = wed; std::cout << "Today is the " << today << "th day of the week." << std::endl; return 0; } ``` 这里`mon`的值是1,`tue`的值是2,以此类推 [^3]。 ### Java 在Java中,枚举是一种特殊的类。可以在枚举中定义构造方法、成员变量和方法等。示例如下: ```java // 定义一个枚举类 enum SeasonEnum { SPRING("Spring", "Warm"), SUMMER("Summer", "Hot"); private String name; private String desc; SeasonEnum(String name, String desc) { this.name = name; this.desc = desc; } public String getName() { return name; } public String getDesc() { return desc; } // 重写toString方法 @Override public String toString() { switch (this) { case SPRING: return SPRING.getName() + "\t" + SPRING.getDesc(); case SUMMER: return SUMMER.getName() + "\t" + SUMMER.getDesc(); default: return "unknow enum obj"; } } } public class Main { public static void main(String[] args) { // 使用枚举常量 SeasonEnum season = SeasonEnum.SPRING; System.out.println(season); // 使用values()方法遍历枚举值 SeasonEnum[] values = SeasonEnum.values(); for (SeasonEnum value : values) { System.out.println(value.getName()); } } } ``` 在这个例子中,`SeasonEnum`是一个枚举类,包含两个枚举常量`SPRING`和`SUMMER`。重写了`toString`方法以获得更多信息,还使用了`values()`方法来遍历所有枚举值 [^4]。 ### 通用使用场景 在程序中使用`enum`设置常量时,可以通过`枚举类型名.常量名`的方式来引用常量。例如在Java中,使用`SeasonEnum.SPRING`;在C和C++中,使用`enum game win`这样的形式 [^1]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值