我从事的项目有很多这样的枚举定义:
enum BundleSize
{
BUNDLE_SIZE_5 = 5,
BUNDLE_SIZE_10 = 10,
BUNDLE_SIZE_107 = 107,
};
我编写了一个函数来从中获取值,例如:
int convertBundleSizeEnumToVal(BundleSize b)
{
switch(b)
{
case BUNDLE_SIZE_5: return 5; break;
case BUNDLE_SIZE_10: return 10; break;
case BUNDLE_SIZE_107: return 107; break;
default: // handle appropriately and error out
}
}
我意识到我真的不需要转换器(方法1和2都可以在下面工作):
BundleSize b = getRandomBundleSize();
printf("The size is %d\n", convertBundleSizeEnumToVal(b)); // method 1
printf("The size is %d\n", b); // method 2
但是我认为方法1仍然是执行此操作的“正确”方法,因为将来可能会出现类似情况:
enum BundleSize
{
BUNDLE_SIZE_5 = 5,
BUNDLE_SIZE_5_POINT_5 = 6,
BUNDLE_SIZE_10 = 10,
BUNDLE_SIZE_107 = 107,
};
现在可以有效地中断方法2,而不会出现明显的运行时错误,而方法1将在默认切换情况下至少解决问题。
我很好奇人们认为什么是处理这些转化的正确方法。
答案 0 :(得分:4)
您可以使用static_cast
运算符:
static_cast<int>(b)
IMO,这是“正确的”。您不应该定义将所有可能的枚举变量转换为整数的函数,尤其是对于大型枚举。
答案 1 :(得分:1)
实际上,您使用的是简单的enum
,因此您可以简单地将enum变量用作值。
对于enum class
(枚举的严格版本),您应使用static_cast
将枚举转换为值。
答案 2 :(得分:0)
您可以将功能简化为:
int convertBundleSizeEnumToVal(BundleSize b)
{
switch(b)
{
case BUNDLE_SIZE_5:
case BUNDLE_SIZE_10:
case BUNDLE_SIZE_107:
return b;
default: // handle appropriately and error out
}
}
方法2被破坏,因为enum
的基础类型不一定是int,因此格式说明符%d可能是错误的,并且程序的行为可能不确定。
您可以先将枚举值强制转换为int,只要您使用的值不超过int可以表示的值,它就将是正确的。您可以使用static_cast或显式强制转换。或者,您可以使用隐式转换:
int value = getRandomBundleSize();
printf("The size is %d\n", b);
关于应该使用哪个,取决于您的需求。如果您认为以后添加的枚举值不应该由convertBundleSizeEnumToVal
进行转换而是会导致错误,那么方法1确实是更好的选择。
如果您希望所有枚举值都将被转换,则该函数容易出错,因为您必须记住每次添加新值时都要添加一个大小写。在这种情况下,方法2更好。