array indexing (converting to integer) with scoped enumeration

前端 未结 5 447
死守一世寂寞
死守一世寂寞 2020-12-30 02:10

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

5条回答
  •  天涯浪人
    2020-12-30 02:43

    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;
      }
    }
    

提交回复
热议问题