enum私はこのようなタイプの束を持っています:
enum Color {COLOR_RED = 0, COLOR_GREEN = 1, COLOR_BLUE = 2, COLOR_NUM};
enum Direction {DIRECTION_FORWARD, DIRECTION_BACKWARD, DIRECTION_NUM};
enum Choice {CHOICE_THIS, CHOICE_THAT, CHOICE_NUM}; // i've just made it up
コードの多くの場所で、考えられるすべての値をループしたいと思います。私はそれをこのように見せたいです:
for (Color c = COLOR_RED; c != COLOR_NUM; ++c)
{
...
}
そのために、私はoperator++一緒に定義しますColor:
enum Color {COLOR_RED = 0, COLOR_GREEN = 1, COLOR_BLUE = 2, COLOR_NUM};
inline Color& operator++(Color& c)
{
c = static_cast<Color>(c + 1);
return c;
}
operator++また、ループのコーディングに慣れている人のために、次i++の代わりに接尾辞を定義し++iます。
inline Color operator++(Color& c, int)
{
Color r = c;
c = static_cast<Color>(c + 1);
return r;
}
テンプレートを使用して、退屈なコードをあまり記述せずにコンパイラーにこれらの演算子を生成させる方法を知りたいです。boost::unit_steppableおそらくプレフィックス1からポストフィックスを生成することがわかりましたoperator++が、それは半分の作業しか実行しません。それでもプレフィックスをoperator++自分で提供する必要があります。
以下は機能しますが、私の意見では「強力」すぎます。
template <class T> T operator++(T x)
{
return static_cast<T>(x + 1);
}
選択したに対してのみ演算子を定義してもらいたいenumのですが。