One alternative technique is to resort to the pre-processor.
#define ITERATE_MY_ENUM(_) \
_(A,) \
_(B, =3) \
_(C,) \
_(D, =10)
enum MyEnum {
#define DEFINE_ENUM_VALUE(key, value) key value,
ITERATE_MY_ENUM(DEFINE_ENUM_VALUE)
#undef DEFINE_ENUM_VALUE
};
void foo() {
MyEnum arr[] = {
#define IN_ARRAY_VALUE(key, value) key,
ITERATE_MY_ENUM(IN_ARRAY_VALUE)
#udnef IN_ARRAY_VALUE
};
}
Some may consider it ugly, but it still keeps the code DRY.