27

私たちが知っているように、C++03 は連続していない可能性があるenumため、C++03 でのインクリメントとデクリメントは違法です。enumしかし、C++11 標準では新しいenum class構造が導入されました。ウィキペディアによると、単純な可算型で構築されていないため、より型安全です。さて、列挙型の値の制限付きリストがある場合、次のように書くことができますか

enum class Colors { Black, Blue, White };
// ...
Colors color = Colors::White;
color++;

それは正しく機能しますか (たとえば、 will return のインクリメントとWhitewill returnのBlackデクリメント)?BlackWhite

そのようなコードを書くことができない場合、この機能を提供する振る舞いのようなクラスを知っていますboostか?Qt

4

1 に答える 1

32

正しく動作しますか

No. enumは、デフォルトで説明した方法で「ラップアラウンド」するようには設計されていません。

enum classまた、C++03 について説明したのと同じように、C++11は連続した値を保証しませんenum

ただし、特定の列挙型のラッピング動作を定義できます。 このソリューションは、説明した列挙型のように、値連続していることを前提としています。

enum class Colors { Black, Blue, White, END_OF_LIST };

// Special behavior for ++Colors
Colors& operator++( Colors &c ) {
  using IntType = typename std::underlying_type<Colors>::type
  c = static_cast<Colors>( static_cast<IntType>(c) + 1 );
  if ( c == Colors::END_OF_LIST )
    c = static_cast<Colors>(0);
  return c;
}

// Special behavior for Colors++
Colors operator++( Colors &c, int ) {
  Colors result = c;
  ++c;
  return result;
}
于 2013-03-16T15:23:34.593 に答える