我做了一个枚举:
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
,但我觉得这应该有用,我想学习如何做到这一点。
任何回应/建议表示赞赏!谢谢!
答案 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;