열거 형의 요소 수를 반환하는 함수를 작성할 수 있습니까? 예를 들어, 내가 정의한 말 : C++에서 열거 형의 카디널리티 (크기)를 찾는 방법이 있습니까?
enum E {x, y, z};
은 다음 (E) f를 3
열거 형의 요소 수를 반환하는 함수를 작성할 수 있습니까? 예를 들어, 내가 정의한 말 : C++에서 열거 형의 카디널리티 (크기)를 찾는 방법이 있습니까?
enum E {x, y, z};
은 다음 (E) f를 3
아니를 반환합니다. 이 있다면
, 당신은 너무 같은 코드 볼 것입니다 :이 코드는 (불쾌한) 솔루션에 대한 힌트는 것을
가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
}
아니요. 하나는 매개 변수로 유형을 사용할 수 없습니다 (유형의 인스턴스 만)
아니요, 이것은 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
}
는 방법이 있습니다,하지만 당신은 매크로를 얻을 수 있습니다 당신은 일을 ... 기본적으로
조금 :) 있습니다.
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. 선언 구문이 마음에 들지는 않지만. – ScaryAardvark
글쎄, (배열, 목록, 시퀀스 및 튜플)에서 선택할 수있는 몇 가지 구조가 있는데,'DEFINE_NEW_ENUM (MyEnum, (Val1, Val2, Val3 = 6)); '에 튜플을 사용할 수있었습니다. 그것은 단지 매크로의 유용성을 보여주는 것입니다 :) –
고마워, 그게 내가 생각해 볼 좋은 해결책 인 것 같아. – rofrankel
물론 연속 열거 형에서만 작동합니다. 오류 코드 목록과 같이 '구멍'이 생긴다면 망가졌습니다. –
트릭을 수행하고 "구멍"문제를 처리하는 간단한 매크로를 게시했습니다. –