问题听起来令人痛苦熟悉。 假设你有枚举:在C++中自动将内在类型转换为enum
enum MyEnum {first, second, third};
现在我想一些INT转换为MyEnum。天真的做法
int i = 2;
MyEnum e = (MyEnum)i;
看起来好,但事实并非如此。首先,2将被转换为“第三”,而不是人们所期望的“第二”。其次,这种转换是愚蠢的,我想要一个聪明的。 动机如下:
void foo(MyEnum e) { ... }
...
foo(2);
这FOO()应该总是收到“第二个” 2不管这是什么枚举的实际值。 有2个明显的解决方案:
- 写转换功能,并始终调用它
- 超载铸造操作
1解决方案显然是可怕的。不想写foo(convetIntToMyEnum(2));
我想写foo(2),编译器会自动调用我的转换函数。所以第二个解决方案就是我需要的。如果'int'是我自己的类,那么重载cast操作符是微不足道的。但'int'是内在类型。
我依稀记得有这种可能性,但找不到它。感谢我金发时刻的治疗。
只要'enum MyEnum {first = 1,second,third};'。问题解决了。 – cdhowie
不,我不想那样。特别是enum可以是{first = 0x1000,second = 0x2000 ...}。提示:枚举代表硬件的一些配置,所以我没有真正自由选择枚举项的值 – Noname
那么为什么heck会映射到0x1000?这有点荒谬。如果你真的想追求这种混淆你自己的代码的奇怪愿望,可以考虑使用类而不是枚举。或查找表。或*字面上任何*除了隐式转换,将数字转换为其他数字。 – cdhowie