为作用域枚举类类型重载“++”运算符

问题描述 投票:0回答:2

我一直在尝试 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++;”线没有。自动增量版本的 ++ 运算符函数的正确形式是什么?

c++ enums operator-overloading
2个回答
4
投票

您可以使用它来实现前缀增量:

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';
}

注意:在每种情况下,计数器均通过引用获取并进行修改。


3
投票

只要遵循错误,以下代码就可以在 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.