c++ - 循环枚举值

标签 c++ enums loops

在枚举上索引循环有多糟糕——或者说它完全可以接受吗?

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

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

enum MyEnum
{
    value1,
    value2,
    value3,
    maxValue
}

for(MyEnum i = value1; i < maxValue; i = static_cast<MyEnum>(i+1)){}

最佳答案

我刚才为这些情况写了一个枚举迭代器

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++);
}

如果你有兴趣,这里是代码。如果愿意,可以通过提供 + 将其扩展为随机访问迭代器。 , < , []和 friend 。类似 std::distance 的算法将感谢您提供 O(1) then 随机访问迭代器的时间复杂度。

#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

关于c++ - 循环枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2479746/

相关文章:

javascript - 如何将值发送到 Javascript 表单元素。不断发送一个值

c++ - 包括 Boost 文件系统头文件

c++ - 元组数

c# - 将字节中的位解析为枚举

java - 如何将编译后的类名与 Java 中的枚举成员匹配?

c - 在动态字符串数组中存储文本文件数据的优雅方法

c++ - C++ 中的 strcpy_s

c++ - 池垃圾收集策略

swift - 可以在 Swift 中将枚举类型名称作为参数传递吗?

javascript - 在.html Javascript循环中使用Django View 中的字典(SyntaxError-意外 token : &#x27)