列挙型が continuous かどうかをC++ 11でチェックする方法はありますか?
ない列挙値を与えることは完全に有効です。 C++ 14、C++ 17、またはC++ 20の型特性のような機能があるのでしょうか?これはstatic_assertで使用されます。
次に小さな例を示します。
enum class Types_Discontinuous {
A = 10,
B = 1,
C = 100
};
enum class Types_Continuous {
A = 0,
B = 1,
C = 2
};
static_assert(SOME_TEST<Types_Discontinuous>::value, "Enum should be continuous"); // Fails
static_assert(SOME_TEST<Types_Continuous>::value, "Enum should be continuous"); // Passes
All列挙型は連続しています。 0は常に許可されます。許可される最高値は、次の_1<<N -1
_(すべてのビットが1)に切り上げられた最高の列挙子であり、その間のすべての値も許可されます。 ([dcl.enum] 9.7.1/5)。負の列挙子が定義されている場合、許可される最小値は、最小の列挙子を切り捨てることによって同様に定義されます。
enum
で定義されている列挙子は、範囲内の値と正しいタイプの定数式ですが、同じプロパティを持つenum
の外側に追加の定数を定義できます。
constexpr enum class Types_Discontinuous = static_cast<Types_Discontinuous>(2)
これについての答えを見たいです。私もそれを必要としてきました。
残念ながら、既存のユーティリティを使用してこれを行うことはできないと思います。これに型の特性を実装する場合は、コンパイラーのサポートが必要であるため、そのためのテンプレートを作成することは現実的ではありません。
列挙型を特定のタグで拡張して、それが隣接していてすぐにサイズがわかることを示しています: 列挙型クラスコンストラクターc ++、特定の値を渡す方法?
または、独自の特性を記述することもできます。
template<T> struct IsContiguous : std::false_type {};
これを使用する連続した列挙型を定義する場合は常に、これを特殊化する必要があります。残念ながら、列挙型が変更された場合、これにはある程度のメンテナンスと注意が必要です。