C++03 까지 열거형은 범위가 제한되어 있지 않았다. 사실 이름이 있는 int 형이라는 인식으로 사용했었다.
C++11에서는 열거형이 강화됐다. 열거형은 namespace 같이 범위를 제한하게 되었고, 열거자는 열거형을 통해서만 접근할 수 있게 바뀌었다.
이전까지는
enum Dir { Left, Right };
로 쓰더라도
int myDir = Left;
같이 int 형으로 대입이 가능하다. 심지어 열거자와 같은 이름의 객체는 생성할 수도 없다.
int Left = 10; // error!
결국, C++03까지의 열거자는 const int 와 별다른 차이가 없었다.
C++11 에서는 enum class 를 통해서 기능을 강화했다.
열거형의 이름 ↓
enum class Dir : int { Left, Right };
↑열거자의 타입
처럼 선언하며, : int 부분은 생략해도 된다. 이 때 열거자의 타입은 int 가 된다.
+ ) 열거자의 타입은 int, short, char 같은 정수 계열 형식이어야 한다.
+ ) bool 형도 가능하지만 형을 강제한다는 경고가 뜬다.
C++03에서, 마지막 열거자를 count 나 end 라고 이름 지어 열거자의 개수만큼의 배열을 만드는 기법이 있었다. 그렇다면 enum class 에서는 그 기법을 사용할 수 없는 걸까?
그렇지는 않다. 열거자는 강제로 int 형으로 형변환을 할 수 있다. 물론 이것은 좋은 방법은 아니다. 기왕이면 열거자의 정확한 타입을 알면 좋다.
이 때 사용 가능한 함수가 있다. std::underlying_type_t 을 사용하면 열거자의 타입에 맞는 값을 반환한다.
Enum 이라는 enum class : char 객체 E = 'C' 가 있을 때, std::underlying_type_t<Enum>(E) ; 의 값은 'C' 이다. 만약 강제 형변환을 했을 경우, 값은 67이 나오게 된다.
enum class 예제는 다음을 참고.
'프로그래밍 > C++' 카테고리의 다른 글
[C++17] filesystem (0) | 2017.05.22 |
---|---|
[C++] invoke 함수의 동작원리를 통해 설명하는 템플릿 부분 특수화와 SFINAE (0) | 2016.08.25 |
[C++11] 균일 초기화(중괄호 초기화) (0) | 2016.07.13 |
[C++11] 가변인자 탬플릿(Variadic Template) (0) | 2016.07.13 |