5

いくつかの列挙型を持つクラスを持つライブラリを使用しています。これが例です

class TGNumberFormat
{
  public:
  // ...
  enum EAttribute {   kNEAAnyNumber
    kNEANonNegative
    kNEAPositive
  };
  enum ELimit {   kNELNoLimits
    kNELLimitMin
    kNELLimitMax
    kNELLimitMinMax
  };
  enum EStepSize {   kNSSSmall
    kNSSMedium
    kNSSLarge
    kNSSHuge
  };
  // etc...
};

コードではTGNumberFormat::kNEAAnyNumber、たとえばこれらを参照する必要があります。これらの値を頻繁に使用するGUIを作成していますが、コードが見苦しくなっています。これらの列挙型をインポートして入力する方法はありkNEAAnyNumberますか?私はこれらの名前のどれもが重複することを本当に期待していません。キーワードのさまざまな使用方法を試しましたが、usingコンパイルされません。

4

4 に答える 4

8

コード全体でこれらの定数を使用している場合は、名前空間の値を再定義する独自のヘッダーを作成すると便利な場合があります。その後、usingその名前空間を作成できます。すべての値を再定義する必要はありません。列挙子の名前だけを再定義する必要があります。例えば、

namespace TGEnumerators
{
    static EAttribute const kNEAAnyNumber(TGNumberFormat::kNEAAnyNumber);
    // etc.
}

TGNumberFormatまたは、頻繁に使用する関数またはソースファイルで短い名前にtypedefすることもできます。例えば、

typedef TGNumberFormat NF;
NF::EAttribute attribute = NF::kNEAAnyNumber;

後者のアプローチが優れていると私は主張します、そしてブロックスコープで賢明に使用されるならば、それは良い習慣です。ただし、ファイル全体で使用する場合は、わかりやすくするために、列挙子のフルネームを使用することをお勧めします。

于 2012-06-12T19:41:18.677 に答える
0

c ++ 11を使用している場合は、キーワードautoを使用してタイプを推測できます。

//the compiler will see auto and know to use: TGNumberFormat::EAttribute
auto attribute = TGNumberFormat::kNEAAnyNumber;

コンパイル:g ++ -std = c ++ 0x -o main main.cpp

c ++ 11を使用していない場合は、@ James McNellisが述べたように、マクロを使用するtypedefの使用を検討してください。
マクロはスコープの規則に従わないため、お勧めしません。typedefは従います。

于 2012-06-12T19:55:08.460 に答える
0

可能ですが、前もってもう少し作業が必要なもう1つの方法は、代わりに使用する定数のバッチを定義することです。

例えば

const TGNumberFormat::EAttribute AnyNumber = TGNumberFormat::kNEAAnyNumber;
const TGNumberFormat::EAttribute NonNegative = TGNumberFormat::kNEANonNegative;
...

attribute = AnyNumber;
于 2012-06-12T20:20:04.910 に答える
0

2つの解決策:

  1. それと一緒に暮らす。
  2. #define AnyNumber TGNumberFormat::kNEAAnyNumber

*カバーのために実行されます...*

于 2012-06-12T21:23:13.410 に答える