迭代c ++中的非连续枚举元素

时间:2013-07-22 10:40:23

标签: c++ enums

有许多方法可以迭代连续的枚举,例如

enum Animal {Cat, Dog, Dolphin}

但是有一种方便简单的方法可以迭代非连续的枚举元素,比如

enum Animal {Cat = 0, Dog = 5, Dolphin = 8}

3 个答案:

答案 0 :(得分:2)

对此的简短回答是“不”。

您可以创建一个表animals,然后在animals上使用范围循环。

这是一个完整的“演示”:

#include <iostream>

using namespace std;

enum Animal {Cat = 0, Dog = 5, Dolphin = 8};

int main()
{
    Animal animals[] = { Cat, Dog, Dolphin };

    for(Animal a : animals) cout << a << endl;
}

输出将是:

0
5
8

答案 1 :(得分:1)

您还可以为枚举提供必要的运算符:

enum Animal
{
  Cat = 0
  , Dog = 5
  , Dolphin = 8
};

inline Animal& operator++ (Animal &x)
{
  switch (x) {
    case Cat:
      x = Dog;
      break;
    case Dog:
      x = Dolphin;
      break;
    case Dolphin:
    default:
      x = static_cast<Animal>(static_cast<int>(x) + 1);
      break;
  }
  return x;
}

DTTO for postfix ++<以及您需要的任何其他内容。当然,您必须使它们与枚举的定义保持同步。不是很简单,但它是一种选择。

答案 2 :(得分:0)

我不确定这个问题是否有意义。它在任何地方 从根本上说不可能。考虑:

enum Animal
{
    cat = 0,
    dog = 5,
    dolphin = 8,
    canine = 5,
    bear = 20
};

当基础值为5时,您无法确定 它是由dog还是由canine设置的,所以没办法 知道下一个值应该是dolphin还是bear。 您可以将值放在数组中,然后迭代它,但是 我没有看到任何其他解决方案。

一般来说,当然,大部分时间你都是明确的 影响这样的值,你要定义一个位掩码(例如 像std::ios_base::fmtflags),在这种情况下,它没有 有意义的迭代。我能想到的其他用例就是 特殊的sentinal值(例如像unset),你 可能想要在迭代时跳过,或者是同义词(比如我的 上面的dog / canine示例,在这种情况下,您可能会 只想访问其中一个同义词,而且实际上,你是 写点如下:

enum Animal
{
    cat,
    dog,
    canine = dog,
    dolphin,
    bear
};

,通常的迭代技巧会产生什么 你想要的。