|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
|
[C] Utilizzo degli enum come shift di 1. Quando si usa?
Ho bisogno di un chiarimento su un uso degli enumeratori che mi è capitato di incontrare un paio di volte ma non mi è chiaro.
Codice:
enum EContext
{
ESingleplayer,
EMultiplayer,
EOutpost,
....
}
Codice:
void SomeClass::Update(int32 context)
{
if ( context & (1<<(int32)m_currentContext) )
{
... do stuff
}
}
Il parametro context della funzione è passato come shift di 1 quando la funzione viene chiamata (questo uso è piuttosto scomodo, una alternativa migliore è che il valore corretto sia assegnato direttamente nella dichiarazione dell'enum così da non dover eseguire lo shift ogni volta che si chiama la funzione ma il concetto comunuqe è lo stesso): Codice:
Update(1<<(int32)EOutpost); Mi sapete dire in quali casi ed a quale scopo sia utile utilizzare questo tipo di soluzione? |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
|
Quote:
E' semplicemente perchè, in caso di un enum con molti valori, si dovrebbero utilizzare troppi && concatenati per testare tutti i valori validi? |
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12965
|
Quote:
Brutto, illegibile e scomodo. Comunque su GCC è perfettamente legale fare questo: Codice:
enum Colors
{
RED = 0x1, /* bits 001 */
YELLOW = 0x2, /* bits 010 */
GREEN = 0x4 /* bits 100 */
};
/* Nota: i bit non si sovrappongono */
int main(void)
{
enum Colors color = (RED|YELLOW); /* bits 011 */
int has_yellow = !!(color & YELLOW);
printf("Color has YELLOW? %d\n", has_yellow); /* stampa 1 */
return 0;
}
Codice:
enum Colors
{
RED = 0x1, /* bits 001 */
YELLOW = 0x2, /* bits 010 */
ORANGE = 0x3, /* bits 011 */
GREEN = 0x4 /* bits 100 */
};
Ultima modifica di WarDuck : 27-12-2014 alle 23:32. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:15.




















