如果可能整数值可能不在枚举值范围内,如何安全地将未知类型的整数值与强类型枚举进行比较?安全地将整数与强类型枚举进行比较
最明显的方法来整数值进行比较,以枚举将投积分值,a
,以枚举类型,E
,并比较枚举值b
,就像这样:
template <typename I, typename E>
bool compare(I a, E b) { return static_cast<E>(a) == b; }
然而,如果a
不在枚举值的范围内,这导致未指定的行为,每[expr.static.cast]/10:
整型或枚举类型的值可以显式转换到一个enumerati类型。如果原始值在枚举值(7.2)的范围内,则值不变。否则,结果值未指定(可能不在该范围内)。
这可以在所得到的故障可以看出(compare
如上):
enum E : uint8_t { A = 0 };
compare(256, E::A); // returns true, 256 == E::A, but E::A = 0
人们可以代替投枚举到整体式,但是这可能会导致不正确的结果,如果积分类型可以不代表所有的枚举值:
enum E : int { A = 256 };
template <typename I, typename E>
bool compare(I a, E b) { return a == static_cast<I>(b); }
compare((uint8_t)0); // returns true, 0 == E::A, but E:A = 256