2016-03-11 2 views
6

Я сделал перечисление, как:перечисление класса в качестве индекса массива

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

I понять ошибку, но я не знаю, куда переместить KeyPressSurfaces, чтобы определить константу в перечислении.

Я также понимаю, что могу просто использовать enum, а не enum class, но я чувствую, что это должно работать, и я хочу узнать, как это сделать.

Любой ответ/совет приветствуется! Благодаря!

+0

Почему вы так много хотите использовать перечисление, чтобы указать размер массива? Размер должен быть постоянной времени компиляции. – user463035818

+2

Перечисление - это постоянная времени компиляции. – parsley72

ответ

9

Области enum s (enum class) неявно конвертируются в целые числа. Вы должны использовать static_cast:

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

Измените ключевое слово class или внесите его явным образом в интегральный тип.

7

Вы можете конвертировать ваши 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; 
} 

I кладезь to_underlying функция here

-2

В качестве альтернативы вы может заменить ваш 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; 
+0

На самом деле это не общее решение проблемы, так как std :: map будет медленнее, чем использование массива. –

+0

«Преждевременная оптимизация - это корень всего зла». - в этом вопросе нет ничего, что говорит о том, что скорость - проблема, компилятор может быть достаточно умен, чтобы справиться с этим, и я считаю это более чистым решением. – parsley72

+0

Я уверен, что никакой компилятор (прошлое, настоящее или будущее) не превратит std :: map в массив. Существует также разница между написанием медленного кода, потому что вы не хотите преждевременно оптимизировать и писать медленный код, потому что вы понятия не имеете, что конструкция, которую вы используете, медленная. Кажется, я пишу программу прямо сейчас (шахматный движок), где производительность, получаемая от использования std :: map, была бы совершенно жестокой. –

Смежные вопросы