我一直在尝试 C++ 的枚举类功能,并成功让
++
运算符重载,如下所示:
enum class counter_t : uint8_t {VAL1 = 0, VAL2, VAL3, VAL4, END};
inline counter_t operator ++ (counter_t c, int) {
counter_t c2;
if (c == counter_t::END) {
c2 = counter_t::VAL1;
}
else {
c2 = (counter_t)((uint8_t)c + 1);
}
return (c2);
}
int main(void) {
volatile counter_t x = counter_t::VAL1;
x = x++;
x++;
while(1) {
// Do stuff
}
}
这相当简单。 “x=x++;”线路工作正常,但是“x++;”线没有。自动增量版本的 ++ 运算符函数的正确形式是什么?
您可以使用它来实现前缀增量:
inline counter_t& operator ++ (counter_t& c) {
if (c == counter_t::END)
c = counter_t::VAL1;
else
c = counter_t(unsigned(c) + 1);
return c;
}
现在,您可以使用前缀增量来实现后缀增量:
inline counter_t operator ++ (counter_t& c, int) {
counter_t result = c;
++c;
return result;
}
测试:
#include <iostream>
int main(void) {
counter_t prefix = counter_t::VAL1;
for(unsigned i = 0; i < 5; ++i)
std::cout << unsigned(++prefix) << ' ';
std::cout << '\n';
counter_t postfix = counter_t::VAL1;
for(unsigned i = 0; i < 5; ++i)
std::cout << unsigned(postfix++) << ' ';
std::cout << '\n';
}
注意:在每种情况下,计数器均通过引用获取并进行修改。
只要遵循错误,以下代码就可以在 MSVC 上编译运行并正常工作。请注意函数参数中的
volatile
和 &
。还有 c2 = c
和一些修改,以遵循 ++
标准(返回值,然后递增)。 volatile
是必需的,只是因为您将 x 声明为 volatile
。
inline counter_t operator ++ (volatile counter_t &c, int)
{
counter_t c2;
if (c == counter_t::END)
c2 = counter_t::VAL1;
else
c2 = static_cast<counter_t>(static_cast<uint8_t>(c) + 1);
c = c2;
return c2;
}