C++ で列挙型がある場合、2 番目のインデックスの値にアクセスできるかどうか疑問に思っていましたか? たとえば、私は
enum Test{hi, bye};
「こんにちは」が必要な場合は、Test[0] などを実行できますか。ありがとうございます。
はいといいえ。Enum に明示的な値がない場合は可能です。明示的な値がない場合、列挙型の値には宣言順に 0 ~ N の数値が与えられます。例えば ...
enum Test {
hi, // 0
bye // 1
}
これは、インデックスがリテラル値に変換されるだけであることを意味します。
Test EnumOfIndex(int i) { return static_cast<Test>(i); }
もちろん、これは実行時に0の検証を行い、明示的な値を追加するとすぐに壊れます。ただし、デフォルトのシナリオでは機能します。
特に指定しない限り、列挙型の番号は 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);
}
列挙は名前を値にマップします。あなたの場合、(int)hi の値は 0 になり、(int)bye の値は 1 になります。キャストを使用して、hi の値を取得できます。
int myInteger = 0;
Test myValue = (Test)myInteger;
ただし、myInteger が範囲外の場合、myValue は無効な列挙値になる可能性があることに注意してください。
いいえ、ただし int からキャストできます
Test test = (Test)0;
「こんにちは」が何を意味するかによって異なります。
値が必要な場合は、他の人が言ったように、int をキャストすることで取得できます。
通常、数値リテラルを列挙型にキャストしても意味がありません。期待する値がわかっている場合は、その名前を使用できます。そうすれば、コードを壊さずに列挙型を変更できます。誰かが列挙型を作成し、「3」の意味を文書化したが、それがどの列挙値であるかを文書化したという、本当に奇妙なことが起こっている可能性があると思います。しかし、API を修正する必要があります。
シリアル化されたデータがある場合は、実行時に既知の整数値を enum にキャストすると役立つ場合があります。列挙型の範囲内にあることがわかっている限り、結果は定義されます。
文字列「こんにちは」が必要な場合は、それを使用できません。Java とは異なり、C++ では、列挙型の値の名前は実行時ではなくコンパイル時にのみ存在し、一方向にのみマップされます。
あなたの最良の選択肢は次のようなものかもしれません:
enum Test{hi = 0, bye};
そうすれば、「hi」を数字の 0 で、「bye」を数字の 1 で簡単に参照できます。
これは、そもそも列挙型を使用する目的全体を実際に無効にしますが。