C ++でintをenumにキャストする方法は?


222

C ++でintをenumにキャストするにはどうすればよいですか?

例えば:

enum Test
{
    A, B
};

int a = 1;

aタイプに変換するにはどうすればよいTest::Aですか?


1
link intがenum型の定数の1つと一致するかどうかは重要ではないことに注意してください。型変換は常に違法です。
Iwaz 2014年

3
int aTest :: Aの暗黙的な値は0で、Test :: Bの暗黙的な値は1であるため、Test :: A にキャストする場合、値は0である必要があると思います。具体的にはTest :: Aはポイントの外にあります...
JohnRDOrazio

回答:


243
int i = 1;
Test val = static_cast<Test>(i);

21
auto val = static_cast <Test>(i); // C ++ 11
Mitch

3
@Mitch autoこの場合、私は何を使うのですか?パフォーマンスの改善はありますか?
Frederico Pantuzza、

2
パフォーマンスの向上はありません。「auto」で指定した場合、コンパイラはタイプを自動的に推定するだけです。将来列挙型の名前を変更する場合は、コンパイラーが正しい型名を自動的に推測するため、コードの変更は少なくなります。
AydinÖzcan19年

74
Test e = static_cast<Test>(1);

10
MSDN:static_castオペレーターは、整数値を列挙型に明示的に変換できます。整数型の値が列挙値の範囲内にない場合、結果の列挙値は未定義です。
Kirill Kobelev

1
@KirillKobelev整数値が列挙型の基になる型で表現できる場合、結果の列挙型はその値を持つ必要があります。それ以外の場合、生成される列挙値は、式を列挙型の基になる型に変換した結果の値になります。VC ++が別のことをする場合、私はそれが不適合だと思います。
bames53

2
enumの値が{1,3,5}で、コードが2の値から<static_cast>を実行しようとした場合、準拠するコンパイラが行うべきこと。C-castとどう違うのですか?
Kirill Kobelev 2012

6
@KirillKobelev Cスタイルキャストとは異なる処理を行うため、static_castを使用していません。CキャストよりスタイルがC ++キャストの方が好ましいため、static_castを使用しています。
bames53 2012

4
@KirillKobelev " if enum has values {1,3,5} "いいえ。列挙型はこれらの3つの可能な値のみに制限することはできません。{1,3,5}は 列挙子(名前付き列挙値)であり、列挙自体ではありません。1,3,5が可能な列挙値である場合、2も2になります
curiousguy

25

あなたのコード

enum Test
{
    A, B
}

int a = 1;

解決

Test castEnum = static_cast<Test>(a);

45
できる限り制限の厳しいキャストを使用し、Cスタイルのキャストを完全に回避して、コンパイラーに間違いを検出する最良の機会を提供することをお勧めします。static_castここでキャストする方が良いでしょう。
マイクシーモア

4
@マイク・シーモア、問題は、静的キャストはこの場合のCキャストと何の違いもないということです。どのように、そしてどのような間違いを検出できますか?
Kirill Kobelev 2012

7
@KirillKobelev:問題は、Cスタイルのキャストが明示的でないことです。これはと同じにするstatic_castこともできますが、a const_castまたはそれよりもさらに悪い、reinterpret_castあるいはそれらの組み合わせになることもあります。何が低下するかがわかっているとしても、a後で別のタイプに変更するとします。これは、警告が表示されることなく、キャストの変更のタイプである可能性が非常に高いので、望まないでしょう。
KillianDS 2012

4
@KillianDS "を後で別のタイプに変更するとします "どのタイプ?
curiousguy

2
はい、利用可能であれば、それらまたは暗黙のキャストのいずれか。キャストの意図が何であるかははるかに明確です。
KillianDS 2012

8

そこにキャストTest::Aをするという要件について厳密ではなく、「どのようにaを型に変換するのか」という最後の質問をスピンオフし、数年遅れてこれに答えるのはよくある質問のようで、他の誰も代替案を述べていないようです、C ++ 11標準に従って:

5.2.9静的キャスト

... 発明された一時変数(8.5)の宣言が整形式であれば、 e式はの形式T を使用して明示的に型に変換できます。このような明示的な変換の効果は、宣言と初期化を実行してから、変換の結果として一時変数を使用するのと同じです。static_caststatic_cast<T>(e)T t(e);t

したがって、フォームt(e)を直接使用することも機能します。

auto result = Test(a);

このソリューションは、コンパイラオプションがstatic_cast <>(セマンティックチェック)をブロックした場合に機能しました。それは私には理にかなっているわけではありませんが、それでもきちんとしています。
Buisson氏、

1

Test castEnum = static_cast<Test>(a-1);aをAにキャストします。substruct1が不要な場合は、次のように再定義できますenum

enum Test
{
    A:1, B
};

この場合、 `test castEnum = static_cast(a); 'です。をAにキャストするために使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.