I made an enum as:
enum class KeyPressSurfaces {
KEY_PRESS_SURFACE_DEFAULT,
KEY_PRESS_SURFACE_UP,
KEY_PRESS_SURFACE_DOWN,
KEY_PRESS_SURFACE_LEFT,
KEY_PRESS_SURFACE_RIGHT,
KEY_PRESS_SURFACE_TOTAL
};
and later on I attempt to define an array as I typed below, but I received the error, size of array 'KEY_PRESS_SURFACES' has non-integral type 'KeyPressSurfaces'
SDL_Surface*KEY_PRESS_SURFACES[KeyPressSurfaces::KEY_PRESS_SURFACE_TOTAL];
I understand the error fine, but I don't know where to move the KeyPressSurfaces
to qualify the constant in the enum.
I also realize I could just use an enum
and not an enum class
, but I feel like this should work, and I want to learn how to do this.
Any response/advice?
Scoped enum
s (enum class
) are not implicitly convertible to integers. You need to use a static_cast
:
SDL_Surface*KEY_PRESS_SURFACES[static_cast<int>(KeyPressSurfaces::KEY_PRESS_SURFACE_TOTAL)];
You can convert your enum
to int
using template function and you will get more readable code:
#include <iostream>
#include <string>
#include <typeinfo>
using namespace std;
enum class KeyPressSurfaces: int {
KEY_PRESS_SURFACE_DEFAULT,
KEY_PRESS_SURFACE_UP,
KEY_PRESS_SURFACE_DOWN,
KEY_PRESS_SURFACE_LEFT,
KEY_PRESS_SURFACE_RIGHT,
KEY_PRESS_SURFACE_TOTAL
};
template <typename E>
constexpr typename std::underlying_type<E>::type to_underlying(E e) {
return static_cast<typename std::underlying_type<E>::type>(e);
}
int main() {
KeyPressSurfaces val = KeyPressSurfaces::KEY_PRESS_SURFACE_UP;
int valInt = to_underlying(val);
std::cout << valInt << std::endl;
return 0;
}
I fount to_underlying
function here
Remove the class
keyword or cast explicitly to an integral type.
Building on the other responses, another alternative is a simple templated class that wraps a c-style array. With the EnumArray example below, any enum class
with a kMaxValue
can be used as the index.
In my opinion, the improved readability is worth the introduction of a template.
template <class IndexType, class ValueType>
class EnumArray {
public:
ValueType& operator[](IndexType i) {
return array_[static_cast<int>(i)];
}
const ValueType& operator[](IndexType i) const {
return array_[static_cast<int>(i)];
}
int size() const { return size_; }
private:
ValueType array_[static_cast<int>(IndexType::kMaxValue) + 1];
int size_ = static_cast<int>(IndexType::kMaxValue) + 1;
};
enum class KeyPressSurfaces {
KEY_PRESS_SURFACE_DEFAULT,
KEY_PRESS_SURFACE_UP,
KEY_PRESS_SURFACE_DOWN,
KEY_PRESS_SURFACE_LEFT,
KEY_PRESS_SURFACE_RIGHT,
KEY_PRESS_SURFACE_TOTAL,
kMaxValue = KEY_PRESS_SURFACE_TOTAL
};
int main() {
EnumArray<KeyPressSurfaces, int> array;
array[KeyPressSurfaces::KEY_PRESS_SURFACE_DEFAULT] = 5;
std::cout << array[KeyPressSurfaces::KEY_PRESS_SURFACE_DEFAULT] << std::endl;
return 0;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With