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
のですが。