【发布时间】:2013-02-24 11:30:30
【问题描述】:
我有一堆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;
}
我还为习惯用i++而不是++i编码循环的人定义了后缀operator++:
inline Color operator++(Color& c, int)
{
Color r = c;
c = static_cast<Color>(c + 1);
return r;
}
我想知道如何使用模板让编译器生成这些运算符,而不必编写太多无聊的代码。我刚刚发现boost::unit_steppable 应该从前缀一生成后缀operator++,但它只完成了一半的工作:我仍然需要自己提供前缀operator++。
以下工作,但在我看来太“强大”:
template <class T> T operator++(T x)
{
return static_cast<T>(x + 1);
}
我希望仅为选定的enums 定义运算符。
【问题讨论】:
-
我认为这不是一个好主意。
-
你绝对绑定到 C++03 吗?
-
@Xeo 是的(必须用 MS Visual Studio 2005 编译)。
-
这样的模板会给你带来很多麻烦,不仅仅是
enum Color {red = 1, blue = 42};。 -
@Cicada 你认为什么是坏主意:使用模板生成这样的代码,或者重载任何运算符? (如果您解释原因,您也可以将其格式化为答案)
标签: c++ templates enums operator-overloading c++03