1. ホーム
  2. c++

[解決済み] 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 を使うと、整数型への暗黙の変換や比較ができなくなりますが、実際には曖昧なコードやバグのあるコードを発見するのに役立つかもしれません。