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

9
有许多方法可以迭代连续的枚举,例如:
enum Animal {Cat, Dog, Dolphin}

但是,是否有一种方便且易于操作的方法可以迭代非连续的枚举元素,例如
enum Animal {Cat = 0, Dog = 5, Dolphin = 8}

不要直接在“枚举”上操作。但是,您可以手动将“枚举”的所有元素放入容器(vectorsetunordered_set等),然后迭代该容器。 - syam
你的意思是想要类似于 for (Animal a = Cat; a != Dolphin; a++) 这样的东西吗?虽然这对于第一个枚举值来说是可行的,但我个人不建议这样做,因为它可能很难阅读和理解。 - Some programmer dude
2
你可以在这个帖子中找到答案 https://dev59.com/0nVC5IYBdhLWcg3wihqv 。 - blitz
请查看此线程:https://dev59.com/AWzXa4cB1Zd3GeqPSVRO - PaperBirdMaster
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

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 ++<和其他任何您需要的内容。当然,您必须确保它们与枚举定义保持同步。这并不是非常直接,但这是一个选项。


0

我不确定这个问题是否有意义。总之,这是根本不可能的。考虑一下:

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

当底层值为5时,您无法确定它是由dog还是canine设置的,因此也无法知道下一个值应该是dolphin还是bear。您可以将这些值放入数组中,并对其进行迭代,但我没有看到其他解决方案。

通常情况下,当您明确影响像这样的值时,您正在定义位掩码(例如,像std::ios_base::fmtflags一样),在这种情况下,迭代没有意义。我能想到的其他用例可能是特殊的标记值(例如,类似于unset的东西),您可能希望在迭代时跳过它们,或者是同义词(如上面我的dog/canine示例),在这种情况下,您可能只想访问其中一个同义词,实际上,您会编写类似于以下内容的代码:

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

和通常的迭代技巧一样,会得到你想要的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接