7

私は列挙型を持っていて、それらすべてをセットに入れたいです(そして、set_intersectionアルゴリズムでいくつかを削除しますが、それはオフトピックです)。ステップ1で立ち往生しているImを除いて、すべてうまく機能します。:)

私が持っている場合(実際のクラスはより高いカーディナリティを持つ列挙型を持っています)

class MyClass
{
enum Color{red, green , blue}
};

std::set<MyClass::Color> すべての列挙型を含めるにはどうすればよいですか。
私は明らかにそれらを1つずつ手動で挿入し、それらが連続していて0から始まるのでキャストでforループを実行できます(列挙型の定義で=を使用しない場合は必要だと思います)が、よりエレガントな方法を探しています。

編集:問題の現在のインスタンスがそれを必要とするので、可能であればC ++ 03ソリュ​​ーションを好みますが、そうでない場合はC++11も知っておくとよいでしょう。

4

3 に答える 3

8

これはオプションです:

#define COLORS {red, green , blue}
enum Color COLORS;
static std::set<Color> color_set() {
    return COLORS;
}
#undef COLORS
于 2013-03-14T14:11:07.097 に答える
4

を使用しstd::bitset< total_colors >ます。これは、有限空間上の集合にとってより適切なデータ構造です。各色はブール値にマップされ、セットの一部であるかどうかを表します。trueを使用してすべてに初期化できますmy_bitset.set()

于 2013-03-14T14:28:09.487 に答える
0

個人的には、ループを使用して、物事をキャストするだけです。

ただし、キャストに完全に反対している場合は、列挙型で演算子を定義して、 を使用してそれらを反復処理できます++。そうすれば、キャストせずにループできます。

于 2013-03-14T14:40:37.197 に答える