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
将枚举转换为值。

实际上,您使用的是simple
enum
,因此您可以简单地将enum变量用作值

对于
enum类
(enum的严格版本),应使用
static\u cast
将枚举转换为值。

static\u cast(b)
static\u cast(b)