C++ 如何将枚举本身作为数组
我有一个enum,但我打算将enum本身作为一个数组,可以作为列表遍历: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
#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';