C++11 scoped enumerators (enum class
syntax) do not convert to integers so they cannot be used directly as array indexes.
What\'s the best way to get th
I'm implementing a combination of DrTwox's solution plus the type safety of Potatoswatter's solution. Enumeration class must be explicitly defined to allow indexing, with size() also defined:
#include
template< typename T >
class EnumClassTraits;
struct EnumClassTraitIndexing {
static constexpr bool does_index = true;
};
template
constexpr
typename std::enable_if::does_index,
typename std::underlying_type::type>::type enum_size() noexcept {
return EnumClassTraits::size();
}
template
typename std::enable_if::does_index,
typename std::underlying_type::type>::type enum_index(T enum_key) noexcept {
return static_cast::type>(enum_key);
}
enum class Days {Mon, Tue, Wed, Thu, Fri, Sat, Sun};
template<>
struct EnumClassTraits : EnumClassTraitIndexing {
static constexpr std::underlying_type::type size() {
return static_cast::type>(Days::Sun)+1;
}
};
int main(int argc, char* argv[]) {
Days days[enum_size()] = {Days::Mon, Days::Tue, Days::Wed, Days::Thu, Days::Fri, Days::Sat, Days::Sun};
const char* days_to_string[enum_size()] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
for (auto day : days) {
std::cout << days_to_string[enum_index(day)] << std::endl;
}
}