我的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
而h
等於Hex::n15
將設置小時,他值16,至極超出的而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;
}
這個問題是個驚喜給我。我打賭,將不正確的值存儲到枚舉值中會引發異常。所以,現在我想知道是否有處理這個枚舉的弱點優雅的方式,我想達到的目標是:
- 查找循環使用枚舉值一個舒適的方式。
- 確保操作之間的enumation數據一致性。
其他問題:
- 是否有當一個枚舉數據得到一個值超出其可能的值不是拋出一個異常的原因是什麼?
- 有推斷與枚舉類相關聯的類型的?類型
int
在枚舉Hex
和Prime
的一種方式。
如果你想迭代,那麼不要使用枚舉。 – Pubby
功能泄漏確實是相當危險的...... –
可以證明,第一個問題僅僅是因爲你是在吸引枚舉 - 因爲你用它們來枚舉整數!用實際整數更好。第二個問題(列舉素數)是不平凡的。 –