8

有很多方法可以遍历连续的枚举,例如

enum Animal {Cat, Dog, Dolphin}

但是有没有一种方便和简单的方法来遍历不连续的枚举元素,比如

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

3 回答 3

3

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

您可以制作一个表格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
于 2013-07-22T10:44:53.793 回答
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;
}

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

于 2013-07-22T11:38:42.083 回答
0

我不确定这个问题是否有意义。无论如何,这在根本上是不可能的。考虑:

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

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

当然,一般来说,大多数情况下,您都在显式地影响像这样的值,您正在定义一个位掩码(例如 like std::ios_base::fmtflags),在这种情况下,迭代是没有意义的。我能想到的其他用例是特殊的标记值(例如,类似unset),在迭代时您可能希望跳过这些值,或者同义词(如上面我的 dog/canine示例),在这种情况下,您可能只想访问同义词之一,实际上,您会写如下内容:

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

,并且通常的迭代技巧会产生您想要的结果。

于 2013-07-22T10:58:35.957 回答