#include <array>
// globally:
template<typename T>
using enum_traits = decltype(get_enum_traits(T{}));
// inside the macro:
#define DEFINE_ENUM(Name, ...) \
/* define "enum class Name" ... */ \
enum class Name { __VA_ARGS__ }; \
struct Name##_type_traits { \
static constexpr std::array<Name,1> values{{ Name{} }}; \
}; \
Name##_type_traits get_enum_traits(Name); // does not need implementation
namespace foo {
DEFINE_ENUM(Foo, Value1, Value2);
}
int main( ) {
for (auto e: enum_traits<foo::Foo>::values)
{}
}
I2luY2x1ZGUgPGFycmF5PgoKLy8gZ2xvYmFsbHk6CnRlbXBsYXRlPHR5cGVuYW1lIFQ+IAp1c2luZyBlbnVtX3RyYWl0cyA9IGRlY2x0eXBlKGdldF9lbnVtX3RyYWl0cyhUe30pKTsKCi8vIGluc2lkZSB0aGUgbWFjcm86CiNkZWZpbmUgREVGSU5FX0VOVU0oTmFtZSwgLi4uKSBcCiAgICAvKiBkZWZpbmUgImVudW0gY2xhc3MgTmFtZSIgLi4uICovIFwKICAgIGVudW0gY2xhc3MgTmFtZSB7IF9fVkFfQVJHU19fIH07IFwKICAgIHN0cnVjdCBOYW1lIyNfdHlwZV90cmFpdHMgeyBcCiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjphcnJheTxOYW1lLDE+IHZhbHVlc3t7IE5hbWV7fSB9fTsgXAogICAgfTsgXAogICAgTmFtZSMjX3R5cGVfdHJhaXRzIGdldF9lbnVtX3RyYWl0cyhOYW1lKTsgLy8gZG9lcyBub3QgbmVlZCBpbXBsZW1lbnRhdGlvbgogICAgCiAgICAKbmFtZXNwYWNlIGZvbyB7CiAgICBERUZJTkVfRU5VTShGb28sIFZhbHVlMSwgVmFsdWUyKTsKfQoKaW50IG1haW4oICkgewogICAgZm9yIChhdXRvIGU6IGVudW1fdHJhaXRzPGZvbzo6Rm9vPjo6dmFsdWVzKQogICAge30KfQo=