2017-04-12 10 views
2

Ich habe etwas Code, den ich für separate Fälle ausführen muss. Ich würde für diese Fälle meistens ein paar Enums und Statiken wechseln müssen. Also, sagen wir, ich Aufzählungen habenC++ beste Möglichkeit, zwischen Configs zu wechseln

enum class City { NY, LA, W_DC, ... } 
City capital = City::W_DC 

und für den anderen Fall

enum class City { LDN, BMH, EDB, ... } 
City capital = City::LDN 

Angenommen, ich habe eine Menge von diesen Aufzählungen haben, was der beste Weg ist, die meisten der Code wiederverwenden und wechseln zwischen den Aufbau. Um es klar zu sagen, dies soll nicht zur Laufzeit geschehen, das Programm soll für einen Fall kompilieren und sich um nichts anderes kümmern.

EDIT: Folgende StackOverflowUser Makros zu verwenden

wäre es ein guter Ansatz sein, die verschiedenen Aufzählungs configs in unterschiedlichen Namensräumen zu speichern und dann tun

#IFDEF USE_NAMESPACE_A 
    using namespace namespace_a 
#ELSE 
    using namespace namespace_a 
#ENDIF 
+0

Warum kombinieren Sie die Enums nicht? – user4581301

+0

Das würde mir nicht helfen mit Variablen wie Kapital im Beispiel – chrise

+0

Warum nicht? "Stadthauptstadt" kann leicht Werte für "Stadt :: W_DC" oder "Stadt :: LDN" enthalten, wenn sie sich in derselben Aufzählung befinden. – user4581301

Antwort

0

Makros erstellen und #ifdef MACRONAME ist der beste Weg, um Überprüfen Sie Dinge vor der Laufzeit, meiner Meinung nach. Sie können auch constexpr Variablen erstellen und ifs verwenden, um die Werte dieser Variablen auszuwerten. Da die Variablen constexpr sind, würde der Compiler sie wahrscheinlich optimieren.

0

Eine Option besteht darin, separate Quelldateien zu erstellen, von denen jede die gewünschte Enumeration enthält. Sie erstellen dann verschiedene Kompilierungsziele, die die relevante Datei als Teil des Builds kompilieren.

Eine andere Option ist die Verwendung der #ifdef ... # else-Präprozessor-Makros, wie zuvor erwähnt, aber Sie haben wahrscheinlich unterschiedliche Kompilierungsziele, um das Makro zu definieren, das die richtige Datei enthält. Anstatt es einzurichten, musst du den Code ändern UND den Build ändern, lege ihn einfach in den Build.

Aber, ehrlich gesagt, Enums sind wahrscheinlich nicht der beste Weg, um das zu tun, was Sie tun möchten. Ein Nachschlagen aus einer Datei/Datenbank/oder einer anderen Datenquelle zur Laufzeit wäre wahrscheinlich ein wartungsfreundlicherer Ansatz. Es erfordert offensichtlich ein bisschen mehr Arbeit, aber wenn das etwas ist, was man langfristig aufrecht erhält, dankt man sich später.

+0

Kompilierziel ist eigentlich das gleiche. Wäre kein Lookup zur Laufzeit generell langsamer? Ich würde es vorziehen, in der Lage zu sein, dies bei der Kompilierzeit aufzuheben, um zusätzlichen Aufwand in den Funktionen – chrise

+0

zu vermeiden. Es wäre nicht unbedingt langsamer. Wenn Sie nicht indizierte Daten im Gigabyte-Bereich hätten, wäre es sicher langsamer. Alles hängt von Ihrer Implementierung ab. Wenn Ihr Kompilierungsziel das gleiche ist, müssen Sie herausfinden, wie Sie den definierten Wert, der in der #ifdef verwendet wird, übergeben können. – Nathan

Verwandte Themen