1

次のようなコードがあるとします。

namespace foo {
  enum bar
  {
    fooBarA,
    fooBarB
  };
}

struct baz
{
  // TODO: map "bar" in this struct to make valid:
  bar returnSomething() { return fooBarA; }
};

// and also this:
void doSomething()
{
  baz myBaz;

  if( baz::fooBarA == myBaz.returnSomething() )
  { /* ... */ }
}

残りを有効にするには、TODO セクションにどのようなコードを追加すればよいでしょうか? いくつかusingまたはtypedef

PS: 「理由」についての質問を避けるために: 名前空間は独自のヘッダー ファイルに存在し、値に同意する必要があるいくつかの異なるクラスによって使用される可能性がありますがfooBarAfooBarBそれらが基づいていることを隠す必要がありますfoo。みんな使ってるbaz

PPS: C++11 が許可されます。役に立ちますかenum class

PPPS:列挙型で宣言を使用するなどの他の質問はありますか? 列挙型が名前空間に直接ではなく、クラスにある場合を処理します。

4

2 に答える 2

1

この方法では、foo 名前空間で少量の作業が必要です。ただし、foo::bar の既存のユーザーには透過的である必要があります。foo::bar の値を、baz クラスを派生させる構造体で囲むだけです。

namespace foo {
  struct barValues
  {
    enum Values {
      fooBarA,
      fooBarB
   };
  };

  typedef barValues::Values bar;
  static const bar fooBarA = barValues::fooBarA;
  static const bar fooBarB = barValues::fooBarB;
}

struct baz : foo::barValues
{
  typedef foo::bar bar;
  bar returnSomething() { return fooBarA; }
};

// and also this:
void doSomething()
{
  baz myBaz;

  if( baz::fooBarA == myBaz.returnSomething() )
  { /* ... */ }
  if( foo::fooBarA == myBaz.returnSomething() )
  { /* ... */ }
}

他の答えに対する利点は、foo::bar の値を名前空間 foo で囲むことです。そこでのみ、この列挙値を追加/変更/削除します。これは私が信じているより安全です。他の回答と比較した場合の欠点は、オプションにできない他のファイルを変更する必要があることです。

于 2012-09-16T12:45:40.383 に答える
0

これはうまくいくでしょう

struct baz
{
    typedef foo::bar   bar;
    static const bar fooBarA = foo::fooBarA;
    static const bar fooBarB = foo::fooBarB;

  // This is now valid
  bar returnSomething() { return fooBarA; }
};

しかし、それが本当に役立つかどうかはわかりません。ユーザーが関数や何かをオーバーロードしようとすると、驚くかもしれません。

于 2012-09-16T12:00:43.393 に答える