C ++列挙型の最大値と最小値


83

C ++で列挙型の最大および最小の定義値を見つける方法はありますか?


見てくださいgithub.com/Neargye/magic_enumのlibが
dalle

1
列挙型自体に追加せずに列挙型の最大値を知りたい理由の1つは、「switch」ステートメントが「最大値」値を明示的に処理しない場合にコンパイラが文句を言わないようにするためです(C4061)。
切れ端-N-カタツムリ

回答:


96

いいえ、C ++で列挙型の定義された最大値と最小値を見つける方法はありません。この種の情報が必要な場合は、Last値とFirst値を定義することをお勧めします。例えば、

enum MyPretendEnum
{
   Apples,
   Oranges,
   Pears,
   Bananas,
   First = Apples,
   Last = Bananas
};

Firstとの間のすべての値に名前付きの値を指定する必要はありませんLast


3
すべての値が存在することを期待しない限り、非順次列挙型でも引き続き役立ちます
Adrian Cornish

@エイドリアン:はい、そうです。この手法を使用するために、すべての値に名前を定義する必要はありません。それに応じて編集します
Jeff Yates 2012年

わかりましたが、新しい値が追加された場合は、その値を維持する必要があります。
マット

30

いいえ、標準のC ++ではありません。あなたはそれを手動で行うことができます:

enum Name
{
   val0,
   val1,
   val2,
   num_values
};

num_values 列挙型の値の数が含まれます。


num_valuesには数値が含まれます-1つの値
4pie0 2014年

12
@lizusek:それ自体num_valuesを除いて、列挙型の値の数が含まれnum_valuesます。
dalle 2014年

3
@dalieはい、それが次のようになる理由です。値の数-1。もちろん、実際の値ではなくヘルパーである最後の値を除く値を意味する値を意味することは知っています。しかし、私はそれをより明確にすることを提案します。
4pie0 2014年

1
@dalle val0 = 0の場合のみ
user2470258 2017

上記で定義されている@ user2470258は常に0です。–
dalle

6

いいえ。CまたはC ++の列挙型は、単なる定数のリストです。そのような情報を保持するより高い構造はありません。

通常、この種の情報が必要な場合は、列挙型に次のような最大値と最小値を含めます。

enum {
  eAaa = 1,
  eBbb,
  eCccc,
  eMin = eAaaa,
  eMax = eCccc
}

これがどのように役立つかの例については、このWebページを参照してください。愚かな列挙型のトリック


あなたがリンクしている記事は、著者のコンパイラが「新しい公式のC ++ブール型をサポートしていない」ときのものです....私は以前に:Pのような古いものを読んだことがありません。
maximum_prime_is_4630358 1820年

4
  enum My_enum
    {
       FIRST_VALUE = 0,

       MY_VALUE1,
       MY_VALUE2,
       ...
       MY_VALUEN,

       LAST_VALUE
    };

定義後、My_enum :: LAST_VALUE == N + 1


-1

自動的ではありませんが、最小値と最大値を示すために人工列挙値を追加できます。

typedef enum {start_of_colors=-1, eRed, eWhite, eBlue, eGray,
end_of_colors} eListOfTags;

for (eListOfTags i = start_of_colors+1; i < end_of_colors; i++) {
.... 
}

1
答えを助けるために説明を追加することを検討してください。
Bibberty

-5

あなたもそれらを必要としません、私がすることはあなたが持っているなら例えば私が言うだけです:

enum Name{val0,val1,val2};

switchステートメントがあり、最後の値に到達したかどうかを確認するには、次のようにします。

if(selectedOption>=val0 && selectedOption<=val2){

   //code
}

16
これは非常に壊れやすい解決策です。新しい列挙値を追加する場合は、そのようなテストを更新するためにコードベース全体を調査する必要があります。
マルセロカントス2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.