[解決済み] enum 型の名前空間 - ベストプラクティス
2022-10-23 17:03:28
質問
しばしば、いくつかの列挙型を一緒に必要とすることがあります。 時には、名前の衝突が発生することがあります。 名前空間を使用するか、「より大きな」列挙型要素名を使用するかの 2 つの解決策が思い浮かびます。 それでも、名前空間の解決策には、ネストされた列挙型を持つダミークラスか、完全な名前空間かの2つの実装が考えられます。
私は、3 つのアプローチすべての長所と短所を探しています。
例
// oft seen hand-crafted name clash solution
enum eColors { cRed, cColorBlue, cGreen, cYellow, cColorsEnd };
enum eFeelings { cAngry, cFeelingBlue, cHappy, cFeelingsEnd };
void setPenColor( const eColors c ) {
switch (c) {
default: assert(false);
break; case cRed: //...
break; case cColorBlue: //...
//...
}
}
// (ab)using a class as a namespace
class Colors { enum e { cRed, cBlue, cGreen, cYellow, cEnd }; };
class Feelings { enum e { cAngry, cBlue, cHappy, cEnd }; };
void setPenColor( const Colors::e c ) {
switch (c) {
default: assert(false);
break; case Colors::cRed: //...
break; case Colors::cBlue: //...
//...
}
}
// a real namespace?
namespace Colors { enum e { cRed, cBlue, cGreen, cYellow, cEnd }; };
namespace Feelings { enum e { cAngry, cBlue, cHappy, cEnd }; };
void setPenColor( const Colors::e c ) {
switch (c) {
default: assert(false);
break; case Colors::cRed: //...
break; case Colors::cBlue: //...
//...
}
}
どのように解決するのですか?
C++03のオリジナル回答です。
は
メリット
からの
namespace
(を超える
class
) を使うことができることです。
using
の宣言を好きなときに使えるということです。
は
問題
を使用した場合の
namespace
を使用した場合の問題は、名前空間がコード内の他の場所で展開される可能性があることです。 大規模なプロジェクトでは、2 つの異なる列挙型が両方とも eFeelings
よりシンプルなコードにするために、私は
struct
を使います。
もしあなたがこれらの実践のいずれかを行っているなら、あなたは先を行っており、おそらくこれ以上精査する必要はないでしょう。
より新しい、C++11 のアドバイスです。
C++11
C++11 以降を使用している場合。
enum class
は、enum の名前の中で enum の値を暗黙的にスコープします。
とは
enum class
を使うと、整数型への暗黙の変換や比較ができなくなりますが、実際には曖昧なコードやバグのあるコードを発見するのに役立つかもしれません。
関連
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み] Java enumのメンバーを比較する:==またはequals()?
-
[解決済み] enumを列挙するには
-
[解決済み] intをenumにキャストするにはどうすればよいですか?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] C#でenumからint値を取得する
-
[解決済み] C#の[Flags]Enum属性の意味とは?
-
[解決済み] JavaScriptSerializer - 列挙型を文字列としてJSONシリアライズする
-
[解決済み] Pythonで'Enum'を表現するにはどうしたらいいですか?
-
[解決済み】TをEnumに拘束するGenericメソッドの作成
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】構造体のベクター初期化について
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み】なぜenumクラスはプレーンなenumより好ましいのですか?