2016-03-11 14 views
6

ho fatto un enum come:classe enum come indice di matrice

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

e poi tento di definire una matrice come ho digitato di seguito, ma ricevuto l'errore, size of array 'KEY_PRESS_SURFACES' has non-integral type 'KeyPressSurfaces'

SDL_Surface*KEY_PRESS_SURFACES[KeyPressSurfaces::KEY_PRESS_SURFACE_TOTAL]; 

I capisco bene l'errore, ma non so dove spostare lo KeyPressSurfaces per qualificare la costante nell'enum.

Mi rendo anche conto che potrei semplicemente usare uno enum e non uno enum class, ma credo che questo dovrebbe funzionare, e voglio imparare come farlo.

Qualsiasi risposta/consiglio è apprezzato! Grazie!

+0

perché vuoi così tanto usare un enum per specificare la dimensione di un array? La dimensione dovrebbe essere una costante di tempo di compilazione. – user463035818

+2

L'enum è una costante di tempo di compilazione. – parsley72

risposta

9

Scoperto enum s (enum class) non sono implicitamente convertibili in numeri interi. È necessario utilizzare un static_cast:

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

Rimuovere la parola chiave class o eseguire il cast esplicito su un tipo integrale.

7

È possibile convertire la enum a int utilizzando la funzione di modello e otterrete il codice più leggibile:

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

ho fonte to_underlying funzione here

-2

In alternativa si può sostituire il tuo array con un map, il che significa anche che puoi liberarti di 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

Questa non è una soluzione generale al problema, dal momento che std :: map sarà più lento rispetto all'utilizzo di un array. –

+0

"L'ottimizzazione prematura è la radice di tutto il male." - Non c'è nulla nella domanda che suggerisce che la velocità sia un problema, il compilatore potrebbe essere abbastanza intelligente da gestire questa situazione e trovo che questa sia una soluzione più pulita. – parsley72

+0

Sono abbastanza sicuro che nessun compilatore (passato, presente o futuro) trasformerà una mappa std :: in una matrice. C'è anche una differenza tra scrivere codice lento perché non si vuole ottimizzare prima del tempo e scrivere codice lento perché non si ha idea del costrutto che si sta utilizzando è lento. Mi capita di scrivere un programma io stesso in questo momento (un motore di scacchi) in cui la performance colpita dall'uso di std :: map sarebbe del tutto brutale. –

Problemi correlati