通过C ++中的枚举迭代

时间:2010-09-03 22:46:10

标签: c++ enums

C ++枚举问题。

所以我有一个文件列表,以及我需要迭代的ID,并做些什么。大多数东西是相同的,但有一些特定于文件的东西需要完成。我尝试将文件ID放在枚举中,并迭代它。但是,fileID是不连续的,并且可以跳转。

目前,我有类似于此的内容

for(int i = 0; i < FILE_ENUM_MAX; i++)
{
    currentFile = myEnum(i);
    // do stuff
}

enum myEnum {
    file1 = 0x1111,
    file2 = 0x8000,
    file3 = 0x75,
    file4 = 0x120,
    FILE_ENUM_MAX = 4
}

这不起作用;我只是浏览文件0,1,2和3.我知道我不能通过询问项目N来获取枚举中的第N项。那么迭代这个枚举的最佳方法是什么?或者我应该摆脱它?我可能可以按照数字顺序放置项目,但我更喜欢解决订单无关紧要的问题。

5 个答案:

答案 0 :(得分:4)

不幸的是,C ++没有提供像你想要的那样迭代枚举的方法。

答案 1 :(得分:4)

我想低技术答案可能是跳过枚举,只是创建一个静态数组:

#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))

int FILE_ENUM[] = { 0x1111, 0x8000, 0x75, 0x120 };

for(int i = 0; i < ARRAYSIZE(FILE_ENUM); i++) {
    currentFile = myEnum[i];
    // do stuff
}

TJ

答案 2 :(得分:1)

我有两点建议:

  1. 使用std::vector包含枚举。
  2. 使用std::map包含 枚举。
  3. 解决方案2提供了一个好处,其中是文件ID,可以是文件的名称(或包含文件属性的对象,例如作为文件句柄或指针)。

答案 3 :(得分:0)

i&lt; = FILE_ENUM_MAX,它将与第4个文件一起迭代。对不起,如果这是一个旧线程,但也许有人仍然需要一个答案试图在这里找到它。

答案 4 :(得分:0)

可能最好的答案是: 你为什么需要它/你不应该?

使用数组或列表或您可以轻松迭代的内容。

如果你需要它是不可变的选择ReadOnlyCollection或ImmutableArray

现在回答这个问题 - 看看这个: - &gt; fiddle diddle 它不仅会迭代低谷值,还会显示名称和基础数字。它说明了枚举中不同名称的编号可以相同。

或许你在考虑这个问题:

public static IEnumerable<T> GetValues<T>() {
    return (T[])Enum.GetValues(typeof(T))
}

如果我是对的,我从 - https://stackoverflow.com/a/972323/5439782

中选择了这个好方法