(어떻게) 열거 형의 항목을 계산할 수 있습니까? Folders {FA, FB, FC}; 각 폴더에 대한 컨테이너

이 질문이 떠 올랐습니다.

enum Folders {FA, FB, FC};

각 폴더에 대한 컨테이너 배열을 만들고 싶었습니다.

ContainerClass*m_containers[3];
....
m_containers[FA] = ...; // etc.

(사용은 사용하기에 훨씬 더 우아 매핑 : std::map<Folders, ContainerClass*> m_containers;)

그러나 원래 질문으로 돌아가려면 배열 크기를 하드 코딩하지 않으려면 폴더에 몇 개의 항목이 있는지 알아내는 방법이 있습니까? (예를 들어 내가 잘못하지 않은 경우 FC와 같은 것을 허용하는 목록의 마지막 항목에 의존하지 않고 ContainerClass*m_containers[FC+1].)



답변

이 작업을 수행하는 좋은 방법은 없습니다. 일반적으로 열거 형에 추가 항목이 표시됩니다.

enum foobar {foo, bar, baz, quz, FOOBAR_NR_ITEMS};

따라서 다음을 수행 할 수 있습니다.

int fuz[FOOBAR_NR_ITEMS];

그래도 여전히 좋지는 않습니다.

그러나 물론 열거 형의 항목 수만 안전하지 않다는 것을 알고 있습니다.

enum foobar {foo, bar = 5, baz, quz = 20};

항목의 수는 4 개이지만 열거 형 값의 정수 값은 배열 인덱스 범위를 벗어납니다. 배열 인덱싱에 열거 형 값을 사용하는 것은 안전하지 않으므로 다른 옵션을 고려해야합니다.

편집 : 요청에 따라 특별 항목을 더 돋보이게했습니다.


답변

C ++의 경우 다양한 형식 안전 열거 기술을 사용할 수 있으며 그중 일부 (예 : 제안되었지만 제출되지 않은 Boost.Enum )에는 열거 형 크기를 가져 오기위한 지원이 포함됩니다.

C 및 C ++에서 작동하는 가장 간단한 방법은 각 열거 형 유형에 대해 … MAX 값을 선언하는 규칙을 채택하는 것입니다.

enum Folders { FA, FB, FC, Folders_MAX = FC };
ContainerClass *m_containers[Folders_MAX + 1];
....
m_containers[FA] = ...; // etc.

편집 : { FA, FB, FC, Folders_MAX = FC}대 관련 {FA, FB, FC, Folders_MAX]: 몇 가지 이유로 … MAX 값을 열거 형의 마지막 법적 값으로 설정하는 것을 선호합니다.

  1. 상수의 이름은 기술적으로 더 정확합니다 ( Folders_MAX가능한 최대 열거 형 값을 제공하기 때문에 ).
  2. 개인적으로 나는 Folders_MAX = FC다른 항목들보다 더 눈에 띄는 느낌이 든다 (마틴 요크가 언급 한 문제인 최대 값을 업데이트하지 않고 실수로 열거 형 값을 추가하는 것이 조금 더 어려워 짐).
  3. GCC에는 다음과 같은 코드에 대해 “스위치에 포함되지 않은 열거 값”과 같은 유용한 경고가 포함되어 있습니다. Folders_MAX == FC + 1을 사용하면 스위치에 포함되어서는 안되는 일련의 … MAX 열거 값이 생성되므로 이러한 경고가 깨집니다.
스위치 (폴더)
{
  사례 FA : ...;
  케이스 FB : ...;
  // 죄송합니다. FC를 잊어 버렸습니다!
}


답변

STL 방식의 특성은 어떻습니까? 예를 들면 :

enum Foo
{
    Bar,
    Baz
};

쓰다

std::numeric_limits<enum Foo>::max()

전문화 (c ++ 11을 사용하는 경우 constexpr). 그런 다음 테스트 코드에서 std :: numeric_limits :: max () = last_item이라는 제약 조건을 유지하기 위해 정적 어설 션을 제공합니다.


답변

열거 형 끝에 Folders_MAX 또는 이와 유사한 항목을 추가하고 어레이를 초기화 할 때이 값을 사용합니다.

ContainerClass* m_containers[Folders_MAX];


답변

열거 형을 함수에 대한 인수로 사용하고 싶습니다. 고정 된 “옵션”목록을 제공하는 쉬운 방법입니다. 여기서 가장 많이 득표 한 답변의 문제점은이를 사용하여 클라이언트가 “잘못된 옵션”을 지정할 수 있다는 것입니다. 스핀 오프로 본질적으로 동일한 작업을 수행하는 것이 좋지만 열거 형 외부의 상수 int를 사용하여 개수를 정의합니다.

enum foobar { foo, bar, baz, quz };
const int FOOBAR_NR_ITEMS=4;

유쾌하지는 않지만 상수를 업데이트하지 않고 열거 형을 변경하지 않으면 깨끗한 솔루션입니다.


답변

C ++에서 열거 형 값의 수를 실제로 얻을 수있는 방법이 없습니다. 너무 크거나 너무 작은 배열을 만드는 상황에서 실행할 수있는 값을 정의하는 경우 열거 형 값을 정의하지 않는 한 앞서 언급 한 솔루션은 모두 작동합니다.

enum example{ test1 = -2, test2 = -1, test3 = 0, test4 = 1, test5 = 2 }

이 예제에서 결과는 5 개 항목의 배열이 필요할 때 3 개 항목의 배열을 생성합니다.

enum example2{ test1 , test2 , test3 , test4 , test5 = 301 }

이 예제에서 결과는 5 개 항목의 배열이 필요할 때 301 개 항목의 배열을 생성합니다.

일반적인 경우이 문제를 해결하는 가장 좋은 방법은 열거 형을 반복하는 것이지만 아직 내가 아는 한 표준에는 없습니다.


답변