C++ 将枚举转换为值的正确方法
我在一个项目上工作,该项目定义了很多枚举,如下所示:C++ 将枚举转换为值的正确方法,c++,C++,我在一个项目上工作,该项目定义了很多枚举,如下所示: 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; b
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都在下面工作):
但我觉得方法1仍然是做到这一点的“正确”方法,因为在未来类似的事情可能会出现:
enum BundleSize
{
BUNDLE_SIZE_5 = 5,
BUNDLE_SIZE_5_POINT_5 = 6,
BUNDLE_SIZE_10 = 10,
BUNDLE_SIZE_107 = 107,
};
它现在有效地中断了方法2,而没有明显的运行时错误,而方法1在默认切换情况下至少会发现问题
我很好奇人们认为什么是处理这些转换的正确方法。您可以使用
static\u cast
操作符:
static_cast(b)
在国际海事组织,这是“正确的”。您不应该定义将每个可能的枚举变量转换为整数的函数,尤其是对于大型枚举。您可以使用
静态\u cast
运算符:
static_cast(b)
在国际海事组织,这是“正确的”。您不应该定义将每个可能的枚举变量转换为整数的函数,特别是对于大型枚举。您可以将函数简化为:
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更高的值,就可以正确转换。您可以使用静态_强制转换或显式强制转换。也可以使用隐式转换:
int value = getRandomBundleSize();
printf("The size is %d\n", b);
关于你应该使用哪一种,这取决于你需要什么。如果您认为以后添加的枚举值不应该由
convertBundleSizeEnumToVal
转换,而是应该导致错误,那么方法1确实更优越
如果希望转换所有枚举值,则该函数容易出错,因为每次添加新值时都必须记住添加一个案例。在这种情况下,方法2更优越。您可以将功能简化为:
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更高的值,就可以正确转换。您可以使用静态_强制转换或显式强制转换。也可以使用隐式转换:
int value = getRandomBundleSize();
printf("The size is %d\n", b);
关于你应该使用哪一种,这取决于你需要什么。如果您认为以后添加的枚举值不应该由
convertBundleSizeEnumToVal
转换,而是应该导致错误,那么方法1确实更优越
如果希望转换所有枚举值,则该函数容易出错,因为每次添加新值时都必须记住添加一个案例。在这种情况下,方法2更优越。实际上,您使用的是简单的
enum
,因此您可以简单地使用enum变量作为值
对于
enum类
(enum的严格版本),您应该使用static\u cast
将枚举转换为值。实际上,您使用的是simpleenum
,因此您可以简单地将enum变量用作值
对于enum类
(enum的严格版本),应使用static\u cast
将枚举转换为值。static\u cast(b)
static\u cast(b)
。