C ++ 열거 형의 최대 값 및 최소값


83

C ++에서 열거 형의 최대 및 최소 정의 값을 찾는 방법이 있습니까?


github.com/Neargye/magic_enum lib를 살펴보십시오
dalle

1
열거 형 자체에 추가하지 않고 열거 형의 최대 값을 알고 싶은 한 가지 이유는 'switch'문이 "최대 값"값을 명시 적으로 처리하지 않을 때 컴파일러가 불평하지 않기 때문입니다 (C4061).
snips-n-snails

답변:


96

아니요, C ++에서 열거 형의 최대 및 최소 정의 값을 찾을 수있는 방법이 없습니다. 이러한 종류의 정보가 필요한 경우 Last 및 First 값을 정의하는 것이 좋습니다. 예를 들면

enum MyPretendEnum
{
   Apples,
   Oranges,
   Pears,
   Bananas,
   First = Apples,
   Last = Bananas
};

First과 사이의 모든 값에 대해 이름을 지정할 필요는 없습니다 Last.


3
비 순차적 열거 여전히 유용 -만큼 당신이 모든 값이 존재 기대 해달라고로
아드리안 콘월어

@Adrian : 네, 사실입니다. 이 기술을 유용하게 사용하기 위해 모든 값이 정의 된 이름을 가질 필요는 없습니다. 나는 그에 따라 편집 할 수 있습니다
제프 예이츠에게

좋아요,하지만 새로운 것이 추가되면 그 가치를 유지해야합니다.
Matt

30

아니요, 표준 C ++에는 없습니다. 수동으로 할 수 있습니다.

enum Name
{
   val0,
   val1,
   val2,
   num_values
};

num_values 열거 형의 값 수를 포함합니다.


num_values는 값의 숫자 -1을 포함합니다
4pie0

12
@lizusek : 자체를 num_values제외하고 열거 형의 값 수를 포함합니다 num_values.
dalle

3
@dalie 예, 그렇기 때문에 다음과 같습니다. 값의 수-1. 물론 실제 값이 아닌 마지막 값을 제외한 값을 의미하는 값을 의미한다는 것을 알고 있습니다. 그러나 더 명확하게 할 것을 제안합니다.
4pie0

1
@dalle val0 = 0 인 경우에만
user2470258

@ user2470258 그 위에 정의는 항상 0입니다
DALLE

6

아니요. C 또는 C ++의 열거 형은 단순히 상수 목록입니다. 그러한 정보를 보유 할 더 높은 구조는 없습니다.

일반적으로 이런 종류의 정보가 필요할 때 열거 형에 다음과 같은 최대 및 최소 값을 포함합니다.

enum {
  eAaa = 1,
  eBbb,
  eCccc,
  eMin = eAaaa,
  eMax = eCccc
}

이것이 어떻게 유용 할 수 있는지에 대한 몇 가지 예를 보려면 다음 웹 페이지를 참조하십시오. Stupid Enum Tricks


당신이 링크 한 기사는 저자 컴파일러가 "새로운 공식 C ++ Boolean 유형을 지원하지 않는"시대의 것입니다.
large_prime_is_463035818

4
  enum My_enum
    {
       FIRST_VALUE = 0,

       MY_VALUE1,
       MY_VALUE2,
       ...
       MY_VALUEN,

       LAST_VALUE
    };

정의 후, My_enum :: LAST_VALUE == N + 1


-1

자동은 아니지만 인위적인 열거 형 값을 추가하여 최소 및 최대 값을 나타낼 수 있습니다.

typedef enum {start_of_colors=-1, eRed, eWhite, eBlue, eGray,
end_of_colors} eListOfTags;

for (eListOfTags i = start_of_colors+1; i < end_of_colors; i++) {
.... 
}

1
답변에 도움이되는 설명을 추가해보세요.
Bibberty

-5

당신은 그것들이 필요하지도 않습니다. 내가하는 일은 예를 들어 다음과 같은 경우에 제가 말하는 것입니다.

enum Name{val0,val1,val2};

switch 문이 있고 마지막 값에 도달했는지 확인하려면 다음을 수행하십시오.

if(selectedOption>=val0 && selectedOption<=val2){

   //code
}

16
이것은 매우 취약한 솔루션입니다. 새 enum 값을 추가하는 경우 전체 코드베이스를 조사하여 이러한 테스트를 업데이트해야합니다.
Marcelo Cantos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.