2015-01-07 9 views
5

Come si abilita/disabilita l'inclusione di elementi in un array const?Abilitare o disabilitare elementi nell'array const

struct country { 
    const string name; 
    ulong pop; 
}; 

static const country countries[] = [ 

    {"Iceland", 800}, 
    {"Australia", 309}, 
//... and so on 
//#ifdef INCLUDE_GERMANY 
version(include_germany){ 
    {"Germany", 233254}, 
} 
//#endif 
    {"USA", 3203} 
]; 

In C, è possibile utilizzare #ifdef per abilitare o disabilitare un particolare elemento in un array, ma come si farebbe che in D?

risposta

3

Ci sono diversi modi. Un modo è quello di aggiungere un array condizionale, utilizzando l'operatore ternario:

static const country[] countries = [ 
    country("Iceland", 800), 
    country("Australia", 309), 
] ~ (include_germany ? [country("Germany", 233254)] : []) ~ [ 
    country("USA", 3203) 
]; 

È possibile anche scrivere una funzione che calcola e restituisce l'array, quindi inizializzare un valore const con esso. La funzione verrà valutata al momento della compilazione (CTFE).

+0

typo: include_germary. Invalido a meno che il germary non sia la lingua. del germe. The Germar, questa importante nazione^ –

+0

Risolto :) Inoltre, avrei dovuto dire che 'include_germany' dovrebbe essere una costante, non una versione, quindi dovrebbe essere dichiarata usando' const'/'enum'. Vedi la risposta di @BBaz 'sotto per farlo funzionare con '-version'. –

+0

sfortunatamente questo non viene compilato ... – user1461607

1

È possibile compilare con l'interruttore personalizzato -version=include_germany. Nel codice si definisce un bool statico:

static bool include_germany; 
version(include_germany){include_germany = true;} 

per costruire la matrice è quindi identico come descritto nella risposta CyberShadow.

+0

Penso che tu abbia bisogno di 'const' o' enum', non 'static'. –

Problemi correlati