2010-02-02 3 views

답변

18

아니를 반환합니다. 이 있다면

, 당신은 너무 같은 코드 볼 것입니다 :이 코드는 (불쾌한) 솔루션에 대한 힌트는 것을

enum E { 
    VALUE_BLAH, 
    VALUE_OTHERBLAH, 
    ... 
    VALUE_FINALBLAH, 
    VALUE_COUNT 
} 

주 - 당신이 마지막 "가드"를 추가하는 경우 요소가 명시 적으로 열거 필드의 값을 명시하지 않는 한 다음 마지막으로 "COUNT"요소는 당신이 찾고있는 값을 갖게됩니다 -이 일이 열거 수가 있기 때문에 제로 기반 :

enum B { 
    ONE, // has value = 0 
    TWO, // has value = 1 
    THREE, // has value = 2 
    COUNT // has value = 3 - cardinality of enum without COUNT 
} 
+0

고마워, 그게 내가 생각해 볼 좋은 해결책 인 것 같아. – rofrankel

+0

물론 연속 열거 형에서만 작동합니다. 오류 코드 목록과 같이 '구멍'이 생긴다면 망가졌습니다. –

+0

트릭을 수행하고 "구멍"문제를 처리하는 간단한 매크로를 게시했습니다. –

2

아니요. 하나는 매개 변수로 유형을 사용할 수 없습니다 (유형의 인스턴스 만)

3

아니요, 이것은 VFAQ이며 답변은 NO !!입니다.

어쨌든 kludging없이.

마지막 입력이있는 트릭도 기본값이 기본값이 아닌 경우에만 작동합니다. 예를 들어,

enum B { 
     ONE, // has value = 0 
     TWO, // has value = 1 
     THREE=8, // because I don't like threes 
     COUNT // has value = 9 
     } 
+0

감사합니다. VFAQ 반복을 위해 죄송합니다. 여기에서 더 큰 웹을 검색했는데이 질문의 인스턴스를 찾을 수 없습니다. – rofrankel

+0

문제 없습니다. 나는 그것이 종종 효과가 있기 때문에 전문가가 "cain't dun"이라고 말하는 것을 알기 위해 자주 검색했습니다. – Mawg

4

는 방법이 있습니다,하지만 당신은 매크로를 얻을 수 있습니다 당신은 일을 ... 기본적으로

조금 :) 있습니다.

DEFINE_NEW_ENUM(MyEnum, (Val1)(Val2)(Val3 = 6)); 

size_t s = count(MyEnum()); 

어떻게 작동합니까?

#include <boost/preprocessor/seq/enum.hpp> 
#include <boost/preprocessor/seq/size.hpp> 

#define DEFINE_NEW_ENUM(Type_, Values_)\ 
    typedef enum { BOOST_PP_SEQ_ENUM(Values_) } Type_;\ 
    size_t count(Type_) { return BOOST_PP_SEQ_SIZE(Values_); } 

길이는 템플릿 전문화 또는 기타 일 수 있습니다. 나는 당신에 대해 잘 모릅니다. 그러나 BOOST_PP의 "시퀀스"의 표현력을 정말 좋아합니다.)

+1

+1. 선언 구문이 마음에 들지는 않지만. – ScaryAardvark

+0

글쎄, (배열, 목록, 시퀀스 및 튜플)에서 선택할 수있는 몇 가지 구조가 있는데,'DEFINE_NEW_ENUM (MyEnum, (Val1, Val2, Val3 = 6)); '에 튜플을 사용할 수있었습니다. 그것은 단지 매크로의 유용성을 보여주는 것입니다 :) –

관련 문제