枚举类作为数组索引

时间:2016-03-11 09:34:48

标签: c++ arrays enums sdl

我做了一个枚举:

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

以后我尝试在下面输入时定义一个数组,但收到错误size of array 'KEY_PRESS_SURFACES' has non-integral type 'KeyPressSurfaces'

SDL_Surface*KEY_PRESS_SURFACES[KeyPressSurfaces::KEY_PRESS_SURFACE_TOTAL];

我理解错误很好,但我不知道将KeyPressSurfaces移动到限定枚举中的常量的位置。

我也意识到我可以使用enum而不是enum class,但我觉得这应该有用,我想学习如何做到这一点。

任何回应/建议表示赞赏!谢谢!

5 个答案:

答案 0 :(得分:13)

Scoped enum s(enum class)不能隐式转换为整数。您需要使用static_cast

SDL_Surface*KEY_PRESS_SURFACES[static_cast<int>(KeyPressSurfaces::KEY_PRESS_SURFACE_TOTAL)];

答案 1 :(得分:11)

您可以使用模板功能将enum转换为int,您将获得更易读的代码:

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

我认为to_underlying函数here

答案 2 :(得分:4)

删除class关键字或明确转换为整数类型。

答案 3 :(得分:1)

在其他响应的基础上,另一种替代方法是包装c样式数组的简单模板化类。在下面的EnumArray示例中,任何带有enum class的{​​{1}}都可以用作索引。

我认为,提高可读性值得引入模板。

kMaxValue

答案 4 :(得分:0)

或者,您可以将array替换为map,这也意味着您可以摆脱KEY_PRESS_SURFACE_TOTAL

enum class KeyPressSurfaces {
    KEY_PRESS_SURFACE_DEFAULT,
    KEY_PRESS_SURFACE_UP,
    KEY_PRESS_SURFACE_DOWN,
    KEY_PRESS_SURFACE_LEFT,
    KEY_PRESS_SURFACE_RIGHT
};

std::map<KeyPressSurfaces, SDL_Surface*> KEY_PRESS_SURFACES;