C ++에서 int를 열거 형으로 캐스팅하는 방법은 무엇입니까?


222

C ++에서 int를 열거 형으로 캐스팅하는 방법은 무엇입니까?

예를 들면 다음과 같습니다.

enum Test
{
    A, B
};

int a = 1;

a유형으로 변환 하려면 어떻게합니까 Test::A?


1
link int가 enum 유형의 상수 중 하나와 일치하는지 여부는 중요하지 않습니다. 타입 변환은 항상 불법입니다.

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
자동 val = static_cast <Test> (i); // C ++ 11
Mitch

3
@Mitch auto이 경우에 무엇 을 사용할 수 있습니까? 성능 향상이 있습니까?
Frederico Pantuzza

2
성능 향상이 없습니다. "auto"로 지정하면 컴파일러가 자동으로 유형을 추론합니다. 나중에 열거 형 이름을 변경하기로 결정하면 컴파일러에서 올바른 유형 이름을 자동으로 추론하므로 코드를 적게 수정합니다.
Aydin Özcan

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

10
MSDN : static_cast 연산자는 정수 값을 열거 형으로 명시 적으로 변환 할 수 있습니다. 정수 유형의 값이 열거 형 값 범위에 속하지 않으면 결과 열거 형 값이 정의되지 않습니다.
Kirill Kobelev

1
적분 값이 열거 형의 기본 유형으로 표시 될 수있는 경우 결과 열거 형은 해당 값을 가져야합니다. 그렇지 않으면 생성 된 열거 형 값은 표현식을 열거 형의 기본 유형으로 변환 한 결과가됩니다. VC ++이 다른 것을 수행하면 부적합하다고 생각합니다.
bames53

2
enum에 값 {1,3,5}가 있고 코드가 2에서 <static_cast>를하려고 시도하는 경우 준수 컴파일러가 수행 할 작업은 무엇입니까? C- 캐스트와 다른 점은 무엇입니까?
키릴 코벨 레프

6
@KirillKobelev C 스타일 캐스트와 다른 점이 있기 때문에 static_cast를 사용하지 않습니다. C ++ 캐스트가 C 캐스트보다 스타일 적으로 선호되므로 static_cast를 사용하고 있습니다.
bames53

4
"@KirillKobelev ENUM 값을 갖는 경우는 {1,3,5} "아니오 열거 타입은 이러한 3 개 가지 값에 한정 될 수 없다 {1,3,5}이있다 열거 (명명 된 열거 된 값)가 아니라 열거 자체 . 1,3,5가 가능한 열거 값 이라면 , 2 도 가능합니다 .
curiousguy

25

귀하의 코드

enum Test
{
    A, B
}

int a = 1;

해결책

Test castEnum = static_cast<Test>(a);

45
컴파일러에게 실수를 감지 할 수있는 가장 좋은 기회를주기 위해 최대한 제한적인 캐스트를 사용하고 C 스타일 캐스트를 피하는 것이 좋습니다. static_cast여기에 더 나은 캐스팅이 될 것입니다.
마이크 시모어

4
@ Seymour와 마찬가지로 문제는 정적 캐스트 가이 경우 C 캐스트와 차이가 없다는 것입니다. 어떻게 그리고 어떤 실수를 감지 할 수 있습니까 ???
Kirill Kobelev

7
@ KirillKobelev : 문제는 C 스타일 캐스트가 명시 적이 지 않다는 것입니다. 그것은과 같을 static_cast수도 있지만 const_cast, 더 나쁘거나, reinterpret_cast또는 그 조합 일 수도 있습니다. 현재 성능이 저하되는 것을 알고 있다고해도 a나중에 다른 유형으로 변경한다고 가정하면 경고만큼의 영향을받지 않고 캐스팅 변경 유형이 될 수 있습니다.
KillianDS

4
@KillianDS "는 나중에 "어떤 유형 에서 다른 유형으로 변경한다고 가정합니다 .
curiousguy

2
네, 가능하다면 암시 적 캐스트입니다. 캐스트의 의도가 더 명확합니다.
KillianDS

8

마지막 질문을 던지면서 "내가 캐스트Test::A 해야하는 요구 사항에 대해 단단하지 않고 "어떻게 유형으로 변환합니까? "라는 질문을 졌습니다. C ++ 11 표준에 따라 :

5.2.9 정적 캐스트

... 일부 선언 된 형식의 임시 변수 (8.5)에 대해 선언 이 올바르게 구성되어 있으면 eT 을 형식의 형식을 사용하여 명시 적으로 형식으로 변환 할 수 있습니다 . 이러한 명시 적 변환의 효과는 선언 및 초기화를 수행 한 다음 변환의 결과로 임시 변수를 사용하는 것과 같습니다.static_caststatic_cast<T>(e)T t(e);t

따라서 양식 t(e)을 직접 사용하면 효과 가 있으며 깔끔하게 선호 할 수 있습니다.

auto result = Test(a);

이 솔루션은 컴파일러 옵션이 static_cast <> (의미 적 검사)를 차단 한 경우에 효과적이었습니다. 그것은 나에게 의미가 있지만 여전히 깔끔합니다.
Mr Buisson

1

Test castEnum = static_cast<Test>(a-1);하위 구조 1을 원하지 않으면 다음을 재정의 할 수 있습니다 enum.

enum Test
{
    A:1, B
};

이 경우`Test castEnum = static_cast (a); ' a를 A로 캐스팅하는 데 사용될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.