我应该对以整数命名的事物使用枚举吗?

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 类型的值(无论是硬编码的还是 运行-time 变量)在调用 IsCriticalHit 时使用,那么你可以有效地编译- 函数参数正确性的时间强制执行:并不是说你不能绕过它并传递一个超出范围的值,但你不太可能不小心这样做。这可能是值得的。

与此相反,调用者有 int 想要传入,然后他们会很不方便地将它们转换为 D6Value,无论是否 [=12] =] 在 16 范围内。如果 IsCriticalHit 由于天真地期望 enum 总是强制执行正确性而放弃防御性编码(检查卷在范围内),那么你的情况比使用 int 更糟并且防御性编码实践。它也很冗长,是其他开发人员需要解决的额外问题。

您还应该考虑要对 D6Value 对象执行的一组操作:对于您的枚举,将不会提供某些运算符(例如 +=(D6Value))和类似的操作+ 产生的结果可能不在类型隐含的 one..six 范围内(以及 C++11 之前的版本,如果实现选择的位数太少,可能会换行; C++11 默认为 int 作为基础类型)。