본문 바로가기

프로그래밍/C++

C++11 enum class

다음은 C++11 에서 강화된 enum 기능이다.


1. 중복 정의 가능


enum  Car

{

SONATA,

AVANTE,

};


enum  FakeCar

{

SONATA,

AVANTE,

};


재정의로 에러가 난다.


하지만, class 한정자를 붙여주면?


enum  class Car

{

SONATA,

AVANTE,

};


enum  class FakeCar

{

SONATA,

AVANTE,

};


깔끔하게 컴파일 된다.




2. 타입 강화


enum  Car : unsigned int

{

SONATA = 1,

AVANTE = 2,

};


enum  FakeCar : unsigned int

{

SONATA2= 1,

AVANTE2 = 2,

};


if( Car::AVANTE == FakeCar::SONATA2 )

{

// 기존과 마찬가지로 컴파일 가능

}


하지만, 위와 마찬가지로 class를 붙여주면


enum  class Car : unsigned int

{

SONATA = 1,

AVANTE = 2,

};


enum  class FakeCar : unsigned int

{

SONATA2= 1,

AVANTE2 = 2,

};


if( Car::AVANTE == FakeCar::SONATA2 )

{

// 타입이 맞지 않으므로 에러발생!

// 물론, static_cast나 C형 캐스팅으로 변환은 가능하다

}



다시 말하면 기존처럼 enum의 약한 타입으로 인해 암시적변환이


class 키워드로 인해 타입이 강화된다는 것을 볼 수 있다.


기존에는 같은 변수를 사용하려면, namespace를 통한 방법을 사용했어야 했다.





3. 타입 정의 가능


enum  class Car : int

{

SONATA = 2100000000,

}; // 가능


enum  class Car : int

{

SONATA = 4200000000,

}; // int형의 크기를 벗어나므로 에러!


참고로 사이즈를 정의하지 않으면, 기본형 타입중에서 자동으로 결정이 되어진다.


enum  class Car  : unsigned int 

{

SONATA = 4200000000,  

}; // unsigned int 이내이므로 가능



4. 전방선언 가능


기존과 다르게 class처럼 전방선언이 가능해졌다.



5. 결론


가급적 타입이 강화된 enum class를 쓰는걸 권장한다.


C++11 은 vs2010부터 부분적으로 지원이 되는데, 


enum class는 vs2012에서 가능한 것을 확인함.


끝.



http://www.cprogramming.com/c++11/c++11-nullptr-strongly-typed-enum-class.html

https://msdn.microsoft.com/ko-kr/library/2dzy4k6e.aspx