수색…


기본 열거 형 선언

표준 열거 형을 사용하면 정수 집합에 유용한 이름을 선언 할 수 있습니다. 이름은 집합 적으로 열거 자라고합니다. 열거 형 및 관련 열거자는 다음과 같이 정의됩니다.

enum myEnum
{
    enumName1,
    enumName2,
};

열거는 유형, 다른 모든 종류의 구별 하나입니다. 이 경우이 유형의 이름은 myEnum 입니다. 이 유형의 개체는 열거 형 내에 열거 자의 값을 가정해야합니다.

열거 형 내에 선언 된 열거자는 열거 형의 상수 값입니다. 열거자는 형식 내에서 선언되지만 범위 연산자 :: 는 이름에 액세스하는 데 필요하지 않습니다. 따라서 첫 번째 열거 자의 이름은 enumName1 입니다.

C ++ 11

범위 연산자는 선택적으로 열거 형 내에서 열거 자에 액세스하는 데 사용할 수 있습니다. 따라서 enumName1myEnum::enumName1 로 표기 할 수 있습니다.

열거 자에는 0에서 시작하여 열거 형의 각 열거 자에 대해 1 씩 증가하는 정수 값이 할당됩니다. 따라서 위의 경우 enumName1 의 값은 0이고 enumName2 의 값은 1입니다.

열거자는 사용자가 특정 값을 지정할 수도 있습니다. 이 값은 정수 상수 표현식이어야합니다. 값이 명시 적으로 제공되지 않는 열거 자의 값은 이전 열거 자 + 1의 값으로 설정됩니다.

enum myEnum
{
    enumName1 = 1, // value will be 1
    enumName2 = 2, // value will be 2
    enumName3,     // value will be 3, previous value + 1
    enumName4 = 7, // value will be 7
    enumName5,     // value will be 8
    enumName6 = 5, // value will be 5, legal to go backwards
    enumName7 = 3, // value will be 3, legal to reuse numbers
    enumName8 = enumName4 + 2, // value will be 9, legal to take prior enums and adjust them
};

switch 문의 열거 형

열거 자의 일반적인 용도는 switch 문을위한 것이므로 일반적으로 상태 시스템에 나타납니다. 실제로 스위치 문에 열거 형의 유용한 특성은 스위치에 기본 문이 포함되어 있지 않고 열거 형의 모든 값을 사용하지 않은 경우 컴파일러에서 경고를 발행한다는 것입니다.

enum State {
    start,
    middle,
    end
};

...

switch(myState) {
    case start:
       ...
    case middle:
       ...
} // warning: enumeration value 'end' not handled in switch [-Wswitch]

enum에 대한 반복

열거를 반복 할 기본 제공 기능이 없습니다.

그러나 몇 가지 방법이 있습니다.

  • 연속 된 값만 가진 enum :

    enum E {
        Begin,
        E1 = Begin,
        E2,
        // ..
        En,
        End
    };
    
    for (E e = E::Begin; e != E::End; ++e) {
        // Do job with e
    }
    
C ++ 11

enum class 하면 operator ++ 를 구현해야합니다.

E& operator ++ (E& e)
{
    if (e == E::End) {
        throw std::out_of_range("for E& operator ++ (E&)");
    }
    e = E(static_cast<std::underlying_type<E>::type>(e) + 1);
    return e;
}
  • 컨테이너를 std::vector

    enum E {
        E1 = 4,
        E2 = 8,
        // ..
        En
    };
    
    std::vector<E> build_all_E()
    {
        const E all[] = {E1, E2, /*..*/ En};
        
        return std::vector<E>(all, all + sizeof(all) / sizeof(E));
    }
    
    std::vector<E> all_E = build_all_E();
    

    그리고

    for (std::vector<E>::const_iterator it = all_E.begin(); it != all_E.end(); ++it) {
        E e = *it;
        // Do job with e;
    }
    
C ++ 11
  • 또는 std::initializer_list 와 간단한 구문 :

    enum E {
        E1 = 4,
        E2 = 8,
        // ..
        En
    };
    
    constexpr std::initializer_list<E> all_E = {E1, E2, /*..*/ En};
    

    그리고

    for (auto e : all_E) {
        // Do job with e
    }
    

범위가 지정된 열거 형

C ++ 11에서는 범위가 지정된 enum을 소개합니다. 이들은 enumname::membername 멤버를 정규화해야하는 열거 형입니다. 범위가 지정된 enum은 enum class 구문을 사용하여 선언됩니다. 예를 들어 무지개에 색상을 저장하려면 다음과 같이하십시오.

enum class rainbow {
    RED,
    ORANGE,
    YELLOW,
    GREEN,
    BLUE,
    INDIGO,
    VIOLET
};

특정 색상에 액세스하려면 :

rainbow r = rainbow::INDIGO;

enum class es는 캐스트없이 int 로 암시 적으로 변환 될 수 없습니다. 따라서 int x = rainbow::RED 가 잘못되었습니다.

Scoped 열거 형을 사용하면 멤버를 나타내는 데 사용 되는 유형기본 유형 을 지정할 수 있습니다. 기본적으로 int 입니다. Tic-Tac-Toe 게임에서는 다음과 같이 조각을 저장할 수 있습니다.

enum class piece : char {
    EMPTY = '\0',
    X = 'X',
    O = 'O',
};

당신이 알다시피, enum 의 마지막 멤버 후에 후행 쉼표를 가질 수 있습니다.

C ++ 11의 열거 형 선언

범위 지정된 열거 형 :

...
enum class Status; // Forward declaration 
Status doWork(); // Use the forward declaration
...
enum class Status { Invalid, Success, Fail };
Status doWork() // Full declaration required for implementation
{
    return Status::Success;
}    

범위가 지정되지 않은 열거 형 :

...
enum Status: int; // Forward declaration, explicit type required
Status doWork(); // Use the forward declaration
...
enum Status: int{ Invalid=0, Success, Fail }; // Must match forward declare type
static_assert( Success == 1 );

깊이있는 멀티 파일 예제는 다음에서 찾을 수 있습니다 : Blind fruit merchant example



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow