web-dev-qa-db-ja.com

連続列挙型C ++ 11

列挙型が 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
17
Bart

All列挙型は連続しています。 0は常に許可されます。許可される最高値は、次の_1<<N -1_(すべてのビットが1)に切り上げられた最高の列挙子であり、その間のすべての値も許可されます。 ([dcl.enum] 9.7.1/5)。負の列挙子が定義されている場合、許可される最小値は、最小の列挙子を切り捨てることによって同様に定義されます。

enumで定義されている列挙子は、範囲内の値と正しいタイプの定数式ですが、同じプロパティを持つenumの外側に追加の定数を定義できます。

constexpr enum class Types_Discontinuous = static_cast<Types_Discontinuous>(2)

1
MSalters

これについての答えを見たいです。私もそれを必要としてきました。

残念ながら、既存のユーティリティを使用してこれを行うことはできないと思います。これに型の特性を実装する場合は、コンパイラーのサポートが必要であるため、そのためのテンプレートを作成することは現実的ではありません。

列挙型を特定のタグで拡張して、それが隣接していてすぐにサイズがわかることを示しています: 列挙型クラスコンストラクターc ++、特定の値を渡す方法?

または、独自の特性を記述することもできます。

 template<T> struct IsContiguous : std::false_type {};

これを使用する連続した列挙型を定義する場合は常に、これを特殊化する必要があります。残念ながら、列挙型が変更された場合、これにはある程度のメンテナンスと注意が必要です。

1
JVApen