web-dev-qa-db-ja.com

列挙型C ++インデックスで取得

C++で、列挙型があるかどうか疑問に思っていましたが、2番目のインデックスの値にアクセスできますか?たとえば、私は持っています

enum Test{hi, bye};

'hi'が必要な場合は、Test [0]のようなことを実行できますか。

15
andrewL

はいといいえ。列挙型に明示的な値がない場合は、可能です。明示的な値がない場合、列挙値には宣言順に0〜Nの数値が与えられます。例えば ​​...

enum Test {
  hi, // 0
  bye // 1
}

これは、インデックスがリテラル値に変換されることを意味します。

Test EnumOfIndex(int i) { return static_cast<Test>(i); }

もちろん、これは実行時に0の検証を行い、明示的な値を追加するとすぐに機能しなくなります。ただし、デフォルトのシナリオでは機能します。

28
JaredPar

特に指定がない限り、列挙型は0から番号を付け始め、エントリごとに1ずつ増加します。

enum Test
{
    hi, //0
    bye, //1
    count //2
}

列挙型の型にintをキャストして、次のような必要な値を取得できます。

(Test)0;
//or
Test(0);

これにより、次のようなことができます。

for(int i = 0; i < count; i++)
{
    DoSomething((Test)i);
}
12
xan

列挙型は名前を値にマップします。あなたの場合、(int)hiの値は0で、(int)byeの値は1です。キャストを使用してhiの値を取得できます。

int myInteger = 0;
Test myValue = (Test)myInteger;

ただし、myIntegerが範囲外の場合、myValueは無効な列挙値になる可能性があることに注意してください。

3
strager

いいえ、でもintからキャストできます

Test test = (Test)0;
2
Rob Prouse

「私は「こんにちは」が欲しい」という意味によって異なります。

他の人が言っているように、値が必要な場合は、intをキャストすることで取得できます。

数値リテラルを列挙型にキャストすることは通常無意味です-期待する値がわかっている場合は、その名前を使用できます。そうすれば、コードを壊すことなく列挙型を変更できます。誰かが列挙型を作成し、「3」の意味を文書化したが、それがどの列挙型の値であるかを文書化していない、本当に奇妙なことが起こっている可能性があると思います。しかし、その後、APIを修正する必要があります。

データをシリアル化した場合は、実行時に既知の整数値を列挙型にキャストすると役立つ場合があります。列挙型の範囲内にあることがわかっている限り、結果が定義されます。

文字列「hi」が必要な場合は、それを使用することはできません。 Javaとは異なり、C++では、列挙型の値の名前はコンパイル時にのみ存在し、実行時には存在せず、一方向にのみマップされます。

1
Steve Jessop

あなたの最良の選択肢は次のようなものかもしれません:

enum Test{hi = 0, bye};

次に、番号0の「hi」と1の「bye」を簡単に参照できます。

これは、そもそも列挙型を使用するという目的全体を実際に無効にしますが。

0
An̲̳̳drew

{Hi or bye}として返される値を除外している場合、そのような値を取得することはできません。

実際の値を取得するためにこれを行うことはお勧めしませんが、ハックとして使用できます

string return_value(int index)
{
string temp = "";
switch (index)
{
case 1: temp = "hi"
break;
case 2: temp = "bye";
break;
defualt :
break;
}
return temp;
}

列挙型に型キャストすると再びインデックスが返されますが、他の列挙型変数に割り当てることができます

0
Chavan Maharshi