프로그래밍(Programming)/c++, 11, 14 , 17, 20
Scoped enums
3DMP
2013. 4. 10. 22:33
http://santacop.tistory.com/62
기존의 C++ enum은 다음과 같은 문제가 있었다.1234567891011121314151617enum
Color
{
Red,
Green,
Blue,
...
}
void
Foo(Color color)
{
switch
(color)
{
case
Red: ...
break
;
case
Green: ...
break
;
case
Blue: ...
break
;
}
}
enum이 전역 공간을 돌아다닐 수 있기 때문에 이름 충돌이 일어날 가능성도 높고 - 예를 들면 어디선가 const string Red = "Red"; 같은거 선언하면 모호해진다 - enum보다는 마치 #define된 상수처럼 보이며, 같은 enum소속인지도 알아보기 힘들고, 같은 enum내에 다른 멤버들이 어떤 것이 있는지 알아보기 힘들며, 어디서 사용되는지 유추할 길이 없는 등의 단점이 있다.
약간의 꼼수로는 Color_Red, Color_Green과 같은 이름을 사용하는 방법이 있긴 하다. 나도 지금까지 이렇게 해왔지만 이제 바꿀 예정!
Scoped enum을 사용하는 방법은 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | namespace Color { enum Type { Red, Green, Blue, ... } } void Foo(Color::Type color) { switch (color) { case Color::Red: ... break ; case Color::Green: ... break ; case Color::Blue: ... break ; } } |
다른 방법 - 밑줄 쓰기
다만 변수를 만들 때 ::Type 이라는 것을 붙여 줘야 하는데 - Color::Type 처럼 - 이것도 싫다면 Color_Red, Color_Green 등올 하는 것이 나을 것으로 보인다.
또 밑줄을 사용할 경우, 단독으로 숫자를 사용할 수 있는 장점이 있다. 예를 들면 Keys_1, Keys_2 처럼 사용하는 것도 가능한데, 만약 namespace를 사용한다면 Keys::1, Keys::2 와 같은 방법은 1과 2처럼 숫자로 시작하는 식별자는 컴파일되지 않는다는 면에서 상대적으로 장점으로 볼 수 있다. 뭐 나같은 경우 Keys::D1, Keys::D2로 쓰고 있기는 하다.
반응형