C++ 如何将枚举本身作为数组

C++ 如何将枚举本身作为数组,c++,C++,我有一个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

我有一个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 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));

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

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

#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';
#定义P#u状态\
X(全部)\
X(半)\
X(组合1)
枚举p_状态{
#定义X(E)E,
美国
#未定义X
P_最大值
};
std::字符串p_状态_字符串[]={
#定义X(E)#E,
美国
#未定义X
};
//...
对于(int i=0;i如果没有为枚举指定显式值,则可以填充从第一个枚举值到最后一个枚举值的数组,每次递增一个。否则,您可以考虑编写枚举类。为什么需要这样做?你想做什么?@zenith想得到所有枚举的列表?像Java的.getAll()或C#的Enum.GetValues()。我猜一个用例是一个权限的枚举,你需要一个简单的方法来分配通用访问。这是不可能的C++枚举。你必须手动操作。C++枚举与java和C的枚举有本质的不同。对我来说,这听起来像XY问题。您真正想在代码中做什么?你想使用枚举作为标志吗?我喜欢X宏的想法,但我不确定qnx编译器是否允许它。让我试试看。
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));
#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';