我非常喜欢 C++ 的强类型特性,我最喜欢的是在处理有限的数据集时使用枚举。
但是枚举缺少一些有用的特性,例如运算符:
enum class Hex : int
{
n00, n01, n02, n03,
n04, n05, n06, n07,
n08, n09, n10, n11,
n12, n13, n14, n15
};
for (Hex h = Hex::n0; h <= Hex::n15; ++h) // Oops! no 'operator ++'
{ /* ... */ }
很容易摆脱在同一范围内创建自由运算符的缺乏运算符:
Hex &operator ++(Hex &h)
{
int r = static_cast<int>(Hex);
h = static_cast<Hex>(r + 1);
return h;
}
for (Hex h = Hex::n0; h <= Hex::n15; ++h) // Now the '++h' works!
{
std::cout << std::dec << int(h) << ": "
<< std::hex << int(h) << '\n';
}
但是这种方法比解决方案更令人讨厌,因为它可以打破枚举的值限制:应用++h
while h
equals toHex::n15
会将 h 设置为值 16,这超出了Hex
值的范围,而h
仍然是类型Hex
!,这个问题在其他枚举中更为明显:
enum class Prime : int
{
n00 = 2, n01 = 3, n02 = 5, n03 = 7,
n04 = 11, n05 = 13, n06 = 17, n07 = 19,
n08 = 23, n09 = 29, n10 = 31, n11 = 37,
n12 = 41, n13 = 43, n14 = 47, n15 = 53
};
Prime &operator ++(Prime &p)
{
// How to implement this?! will I need a lookup table?
return p;
}
这个问题对我来说是一个惊喜。我打赌将不正确的值存储到枚举值中会引发异常。所以,现在我想知道是否有一种优雅的方式来处理这个枚举的弱点,我想要实现的目标是:
- 找到一种在循环中使用枚举值的舒适方式。
- 确保操作之间的枚举数据一致性。
附加问题:
- 当枚举数据获得的值超出其可能值时,是否有理由不引发异常?
- 有一种方法可以推断与枚举类关联的类型?、枚举中的
int
类型Hex
和Prime
.