如何将枚举本身作为数组

How to have an enum itself as an array

本文关键字:数组 枚举      更新时间:2023-10-16

我有一个enum,但我想让enum本身作为一个数组,我可以作为一个列表遍历:

#include <iostream>
using namespace std;
typedef enum p_states {
    ALL,
    SEMI,
    COMBO1,
}states;
states s;
int main()
{
    s = ALL;
    cout<<s[0]<<endl;
    cout<<s[1]<<endl;
    cout<<s[2]<<endl;
}

导致错误:

enum_states.cpp: In function ‘int main()’:
enum_states.cpp:12:11: error: invalid types ‘states {aka p_states}[int]’ for array subscript
  cout<<s[0]<<endl;
           ^
enum_states.cpp:13:11: error: invalid types ‘states {aka p_states}[int]’ for array subscript
  cout<<s[1]<<endl;
           ^
enum_states.cpp:14:11: error: invalid types ‘states {aka p_states}[int]’ for array subscript
  cout<<s[2]<<endl;
           ^

我只能想到有一个数组状态

s[3] = {ALL,SEMI,COMBO1};

是否有更好的方法只定义一次并将其作为枚举?

不能将enum视为数组。在你的情况下,没有必要。枚举从0开始顺序。只要知道整数值在边界内,就可以简单地将索引值赋给枚举类型的变量。但是,输出将只反映整数本身,而不是符号符号。

如果您愿意使用X宏,您可以轻松地从单个状态列表创建并行数据结构。其中一个数据结构可以是数组。

#define P_STATES_X 
        X(ALL)     
        X(SEMI)    
        X(COMBO1)
enum p_states {
    #define X(E) E,
    P_STATES_X
    #undef X
    P_STATES_MAX
};
std::string p_states_strings[] = {
    #define X(E) #E,
    P_STATES_X
    #undef X
};
//...
    for (int i = 0; i < P_STATES_MAX; ++i)
        std::cout << p_states_strings[i] << 'n';

如果您试图使用枚举作为标志,您可以指定每个枚举数的基础值,以便能够在位操作符的帮助下将它们用作标志集:

enum permission
{
    ReadPermission = 1,
    WritePermission = 2,
    ExecutePermission = 4,
    // etc.
    FullPermissions = ReadPermissions | WritePermissions | ExecutePermission
};
bool hasReadPermission(permission P)
{
    return P & ReadPermission;
}
bool hasWritePermission(permission P)
{
    return P & WritePermission;
}
void addReadPermission(permission& P)
{
    P |= ReadPermission;
}
void removeReadPermission(permission& P)
{
    P &= ~ReadPermission;
}
…
int MyPermissions = FullPermissions;
assert(hasReadPermission(MyPermissions));
assert(hasWritePermission(MyPermissions));
removeReadPermission(MyPermissions);
assert(!hasReadPermission(MyPermissions));