循环枚举值

Rac*_*hel 9 c++ enums loops

在枚举上索引循环是多么可怕 - 或者它是否完全可以接受?

我有一个枚举定义.文字的值是默认值.指定的值没有任何意义,没有任何意义,将来添加的任何文字的值也没有任何意义.它被定义为限制允许的值并使事情更容易遵循.因此,值始终从0开始并增加1.

我可以这样设置一个循环:

enum MyEnum
{
    value1,
    value2,
    value3,
    maxValue
}

for(MyEnum i = value1; i < maxValue; i = static_cast<MyEnum>(i+1)){}
Run Code Online (Sandbox Code Playgroud)

Joh*_*itb 9

我刚才为这些案例编写了一个枚举迭代器

enum Foo {
 A, B, C, Last
};

typedef litb::enum_iterator<Foo, A, Last> FooIterator;

int main() {
  FooIterator b(A), e;
  std::cout << std::distance(b, e)  << " values:" << std::endl;
  std::copy(b, e, std::ostream_iterator<Foo>(std::cout, "\n"));

  while(b != e) doIt(*b++);
}
Run Code Online (Sandbox Code Playgroud)

如果您有兴趣,这是代码.如果你喜欢,你可以扩展它通过提供为随机访问迭代器+,<,[]和朋友.类似的算法std::distanceO(1)为当时的随机访问迭代器提供时间复杂度.

#include <cassert>

namespace litb {

template<typename Enum, Enum Begin, Enum End>
struct enum_iterator 
  : std::iterator<std::bidirectional_iterator_tag, Enum> {
  enum_iterator():c(End) { }
  enum_iterator(Enum c):c(c) { }

  enum_iterator &operator=(Enum c) {
    this->assign(c);
    return *this;
  }

  enum_iterator &operator++() {
    this->inc();
    return *this;
  }

  enum_iterator operator++(int) {
    enum_iterator cpy(*this);
    this->inc();
    return cpy;
  }

  enum_iterator &operator--() {
    this->dec();
    return *this;
  }

  enum_iterator operator--(int) {
    enum_iterator cpy(*this);
    this->dec();
    return cpy;
  }

  Enum operator*() const {
    assert(c != End && "not dereferencable!");
    return c;
  }

  bool equals(enum_iterator other) const {
    return other.c == c;
  }

private:
  void assign(Enum c) {
    assert(c >= Begin && c <= End);
    this->c = c; 
  }

  void inc() {
    assert(c != End && "incrementing past end");
    c = static_cast<Enum>(c + 1);
  }

  void dec() {
    assert(c != Begin && "decrementing beyond begin");
    c = static_cast<Enum>(c - 1);
  }

private:
  Enum c;
};

template<typename Enum, Enum Begin, Enum End>
bool operator==(enum_iterator<Enum, Begin, End> e1, enum_iterator<Enum, Begin, End> e2) {
  return e1.equals(e2);
}

template<typename Enum, Enum Begin, Enum End>
bool operator!=(enum_iterator<Enum, Begin, End> e1, enum_iterator<Enum, Begin, End> e2) {
  return !(e1 == e2);
}

} // litb
Run Code Online (Sandbox Code Playgroud)


Car*_*rum 4

就我而言,这很好。我确信某些地方的纯粹主义者会感到害怕,但就语言规范而言,该代码将正常工作,因此如果它能让您的生活更轻松,您应该随意使用它。