私は 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';
}
しかし、このアプローチは、列挙型の値の制限を破る可能性があるため、解決策というよりも迷惑です: while equals を適用すると++h
、h
hHex::n15
が値 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
.