如果一个整数值类型未知,如何安全地将其与强类型枚举进行比较,当这个整数值可能不在枚举值的范围内时?
将整数值 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:整数或枚举类型的值可以被显式转换为枚举类型。如果原始值在枚举值的范围内(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