2017-04-12 13 views
2

私は別のケースで実行する必要があるいくつかのコードがあります。私はそのような場合には、主にいくつかの列挙型と静的なものを切り替える必要があります。それでは、私は列挙型C++の設定を切り替える最も良い方法

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

およびその他のケース

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

のために、私は、これらの列挙型の多くを持っていると仮定するとしましょう、それらの間のコードとスイッチの大半を再利用するための最良の方法は何ですか構成。明確にするために、これは実行時に起こることを意図したものではなく、プログラムはあるケースでコンパイルされ、何か他のものを忘れることになっています。

EDIT:StackOverflowUserマクロに

を使用するには、次のことが異なる名前空間に異なる列挙型のconfigsを保存して、マクロを作成し、#ifdef MACRONAMEを使用して

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

列挙型を組み合わせてみませんか? – user4581301

+0

これは、例の資本のような変数で私を助けてくれることはありません – chrise

+0

なぜでしょうか? 'City capital ::'は 'City :: W_DC'や' City :: LDN'の値を同じ列挙型に入れると、その値を簡単に入れることができます。 – user4581301

答えて

0

を行うには良い方法でしょうがための最良の方法です私の意見では、実行時間の前に確認してください。 constexpr変数を作成し、ifsを使用してそれらの変数の値を評価することもできます。変数はconstexprなので、コンパイラはそれらを最適化する可能性が最も高いでしょう。

0

1つのオプションは、それぞれに必要な列挙型を含む別々のソースファイルを作成することです。ビルドの一部として関連ファイルをコンパイルする異なるコンパイルターゲットを作成します。

もう1つの方法は、先に述べたように#ifdef ...#elseプリプロセッサマクロを使用することですが、正しいファイルを含むマクロを定義するコンパイルターゲットが異なる可能性があります。それを設定するのではなく、コードを変更してビルドを変更する必要があります。単にビルドするだけです。

しかし、正直なところ、列挙型は、おそらくあなたがしたいことを行うための最良の方法ではありません。実行時のファイル/データベース/その他のデータソースからのルックアップは、よりメンテナンス可能なアプローチになりそうです。明らかにもう少し作業が必要ですが、これが長期的なものであれば、後で自分自身に感謝します。

+0

コンパイルのターゲットは実際に同じです。実行時のルックアップは一般的に遅くなりますか?関数の余分なオーバーヘッドを避けるために、コンパイル時にこれを分割することができるようにすることをお勧めします。 – chrise

+0

必ずしも遅くなるとは限りません。もしあなたがインデックス化されていないデータのギガバイト相当のデータを反復するのであれば、それは遅くなるでしょう。それはすべて実際の実装に依存します。コンパイルターゲットが同じ場合は、#ifdefで使用されている定義済みの値を何らかの方法で渡す方法を理解する必要があります。 – Nathan

関連する問題