2015-01-07 6 views
5

Wie aktiviert/deaktiviert man das Einfügen von Elementen in ein const-Array?Aktivieren oder Deaktivieren von Elementen im const-Array

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 können Sie #ifdef verwenden zu aktivieren oder ein bestimmtes Element in einem Array zu deaktivieren, aber wie würden Sie tun, dass in D?

Antwort

3

Es gibt mehrere Möglichkeiten. Eine Möglichkeit ist, ein Array bedingt anzuhängen, die ternäre Operator:

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

Sie können auch eine Funktion schreiben, die berechnet und gibt das Array, dann initialisieren einen const Wert mit ihm. Die Funktion wird zur Kompilierzeit (CTFE) ausgewertet.

+0

typo: include_germary. Ungültig, es sei denn, das Germist ist die Sprache. des Germars. Die Germar, diese wichtige Nation ^^ –

+0

Fixed :) Auch sollte ich erwähnt haben, dass 'include_germany' erwartet wird, eine Konstante zu sein, keine Version, so sollte es erklärt werden mit' const'/'enum'. Siehe @BBaz 'Antwort unten, um es mit' -version 'arbeiten zu lassen. –

+0

leider kompiliert das nicht ... – user1461607

1

Sie können mit dem benutzerdefinierten Schalter -version=include_germany kompilieren. Im Code definieren Sie eine statische Bool:

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

das Array zu bauen ist dann identisch wie in der CyberShadow Antwort beschrieben.

+0

Ich denke du brauchst 'const' oder' enum', nicht 'static'. –

Verwandte Themen