将枚举值转换为值的正确方法

时间:2019-01-12 03:40:30

标签: 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; 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将在默认切换情况下至少解决问题。

我很好奇人们认为什么是处理这些转化的正确方法。

3 个答案:

答案 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更好。