c++ enum

2013. 10. 24. 09:26C++

http://santacop.tistory.com/62


C++에서 C#처럼 enum을 쓰는 방법이 있다!

namespace 관련해서 자료를 조사하다가 나온건데...
(참고: C++ namespace(네임스페이스) 코딩 스타일)
 
 

Unreal쪽 자료를 찾아보다가 여길 보니 enum을 C#스타일로 쓰기 위해 namespace를 사용한다는 내용이 나온다. 나도 예전에 생각해봤던건데 진짜로 쓰는 데가 있었구나!

http://udn.epicgames.com/Three/CodingStandard.html


기존의 C++ enum은 다음과 같은 문제가 있었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
enum Color
{
    Red,
    Green,
    Blue,<br>
    ...
}
 
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,<br>
        ...
    }
}
 
void Foo(Color::Type color)
{
    switch(color)
    {
    case Color::Red: ... break;
    case Color::Green: ... break;
    case Color::Blue: ... break;
    }
}

이제 각 enum형 상수들이 소속을 가지게 되었다! Visual Studio같은 IDE를 사용한다면 F12등을 누른다거나 Ctrl+Space를 눌러서 Color의 다른 멤버 목록까지 볼 수 있다.