我应该将枚举用于以整数命名的内容吗?

时间:2015-12-14 05:13:00

标签: c++ enums coding-style

enum D6value {
    one = 1,
    two = 2,
    three = 3,
    four = 4,
    five = 5,
    six = 6 };

bool IsCriticalHit(D6value roll);

我喜欢这个,因为它可以更好地记录函数参数。

我不喜欢这个,因为这是我梦寐以求的东西,它让我觉得很聪明 - 这通常是我在后悔之前的感受。

这是不好的风格吗?

1 个答案:

答案 0 :(得分:1)

如果调用者可能在调用D6Value时使用IsCriticalHit类型的值(无论是硬编码还是运行时变量),那么您可以有效地获得编译时强制执行函数参数的正确性:并不是说你不能破解它并传递超出范围的值,但你不太可能意外地做到这一点。这可能是值得的。

反驳说,来电者有int他们想要传入的内容,然后他们会将这些信息投放到D6Value,这无论是否int都会有效。 }}位于16范围内。如果IsCriticalHit由于天真地期望enum始终强制执行正确性而放弃防御性编码(检查滚动在范围内),那么比您使用int时更糟糕s和防御性编码实践。对于其他开发人员来说,这也是一个冗长而且额外的事情。

您还应该考虑要对D6Value个对象执行的操作集:使用您的枚举,某些运算符无法提供(例如+=(D6Value))和像+这样的操作产生的结果可能不在类型隐含的one .. six范围内(而且在C ++ 11之前,如果实现选择了一个表示,则可以包装几个位; C ++ 11默认为int作为基础类型。)