将枚举转换为值的正确方法
Correct way to convert an enum to value
我正在做一个项目,该项目定义了很多枚举,如下所示:
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 %dn", convertBundleSizeEnumToVal(b)); // method 1
printf("The size is %dn", 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 至少会在默认开关情况下捕获问题。
我很好奇人们认为处理这些转换的正确方法是什么。
您可以使用
static_cast
运算符:
static_cast<int>(b)
IMO,这是"正确的"。您不应该定义函数来将每个可能的枚举变体转换为整数,尤其是对于大型枚举。
实际上,您使用的是简单的enum
,因此您可以简单地使用枚举变量作为值。
对于enum class
(枚举的严格版本),您应该使用 static_cast
将枚举转换为值。
您可以将函数简化为:
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 %dn", b);
关于你应该使用哪个,这取决于你需要什么。如果您认为以后添加的枚举值不应该通过convertBundleSizeEnumToVal
进行转换,而应该导致错误,那么方法 1 确实更胜一筹。
如果您希望转换所有枚举值,则该函数容易出错,因为您必须记住每次添加新值时添加一个大小写。在这种情况下,方法 2 更胜一筹。
相关文章:
- 枚举环境变量的惯用C++14/C++17方法
- 枚举元组类型的最佳方法?
- 基于枚举参数调用专用模板方法
- 替换枚举以最大化编译时间检查的最佳方法
- 将枚举与 CMake 链接的正确方法是什么?
- 为什么方法重载或枚举标志定义会触发 gcc7.2 编译器警告?
- 如何将枚举传递给方法而不将其作为整数传递
- 我的私有方法如何在C++中访问公共枚举
- 枚举器 C++ 的 setter 和 getter 方法
- 一种创建将字符串常量返回给枚举的类的廉价方法,反之亦然
- 有没有一种方法可以在基于枚举的可变参数模板函数之间进行选择,这比将函数包装在结构中更简单
- 如何定义在外部类之外返回枚举黑客的嵌入式类的方法?
- 是否有一种有效的,适当的方法将非常大的公共班级枚举放在利用它们的公共方法之下,以使代码更加干净
- 具有枚举类型类型的C 方法
- 是否可以定义一个宏来定义枚举类和返回枚举元素计数的 GetCount() 方法
- 将枚举转换为值的正确方法
- 在 .NET 中调用 COM 枚举器的正确方法是什么?
- 使用 Doxygen 或类似方法记录枚举标志
- 虚拟方法返回代表派生对象类型的枚举 - 是否可以(在设计方面)
- 如何在 c++ 中的 Normal 或 Singleton 类中 GoogleTest 私有方法/枚举类