我应该对以整数命名的东西使用枚举吗?
Should I use enums for things that are named after integers?
enum D6value {
one = 1,
two = 2,
three = 3,
four = 4,
five = 5,
six = 6 };
bool IsCriticalHit(D6value roll);
我喜欢这个,因为它可以更好地记录函数参数。
我不喜欢这样,因为这是我梦寐以求的东西,它让我觉得很聪明——这通常是我在后悔之前的感觉。
这是不好的作风吗?
如果调用者可能有一个类型D6Value
的值(无论是硬编码的还是运行时变量(在调用IsCriticalHit
时使用,那么你就可以有效地在编译时强制执行函数参数的正确性:并不是说你不能绕过它并传递一个超出范围的值,但你不太可能意外地做到这一点。 这可能是值得的。
与此相反,它调用者有他们想要传入的int
,然后他们将不方便将它们投射到D6Value
,无论int
是否在1
到6
范围内,这都将起作用。 如果IsCriticalHit
放弃防御性编码(检查滚动在范围内(,因为天真地期望enum
总是强制执行正确性,那么你的情况比你使用int
和防御性编码实践更糟糕。 它也很冗长,对于其他开发人员来说,这是一件额外的事情。
您还应该考虑要对D6Value
对象执行的操作集:使用枚举时,不会提供某些运算符(例如 +=(D6Value)
(和像+
这样的操作会产生可能不在类型隐含one
中的结果。six
范围(和 C++11 之前(如果实现选择位太少的表示形式,则可能会换行;C++11 默认为 int
作为基础类型(。
相关文章:
- C++/错误:表达式必须具有整数或无作用域枚举类型
- 给枚举一个整数,并在 C++ 中将其相关值作为字符串获取
- 生成整数长度的枚举数组
- 涉及旧式枚举和整数类型的重载解析
- C++ 在方程中使用变量;错误:表达式必须具有整数或无作用域枚举类型及其他
- C ++枚举可以与整数进行比较,但不能从整数分配?
- 如何将枚举传递给方法而不将其作为整数传递
- 元编程构造,它返回枚举的基础类型和迭代器的整数
- 三重限制的正整数组合的非递归枚举
- 如何编写模板以转换为基于整数/枚举的模板化类型
- 错误:以增量方式填充向量时,表达式必须具有整数或无作用域枚举类型
- 为什么不用static_cast的整数来初始化强大的枚举
- 从用户输入中提取整数的枚举开关语句
- 从整数到枚举的首选转换样式 QEvent::Type
- C 示波器的枚举是隐式转换为整数的
- 从整数到枚举值时,如何和何处检查错误
- 阵列索引(转换为整数)用范围枚举
- 将枚举类型转换为整数,反之亦然
- 表达式必须具有整数或枚举类型
- 枚举在内部作为整数实现.那为什么会给出错误