我在C++中想知道,如果我有一个枚举,我是否可以访问第二个索引处的值?例如,我有
enum Test{hi, bye};
如果我想要“hi”,我能像 Test[0] 这样做吗,谢谢。是与否。如果你的枚举类型没有明确的值,那么是可能的。没有明确值的情况下,枚举值会按照声明顺序从0到N被赋予数值。例如...
enum Test {
hi, // 0
bye // 1
}
这意味着索引只是将一个字面值翻译成另一个字面值。
Test EnumOfIndex(int i) { return static_cast<Test>(i); }
当然,这种方法在运行时不进行任何验证,一旦添加了显式值就会出错。但是在默认情况下它可以工作。
除非另有说明,枚举从0开始编号,并且每个条目递增1。
enum Test
{
hi, //0
bye, //1
count //2
}
你可以将int强制转换为枚举类型以获得所需的值,例如:
(Test)0;
//or
Test(0);
这可以让您做一些像这样的事情:
for(int i = 0; i < count; i++)
{
DoSomething((Test)i);
}
枚举将名称映射到值。在您的情况下,(int)hi的值为0,(int)bye的值为1。您可以使用强制转换来获取hi的值:
int myInteger = 0;
Test myValue = (Test)myInteger;
Test test = (Test)0;
“我想要 'hi'”有不同的解释。
如果你想要值,那么你可以像其他人所说的那样将其转换为int来获取它。
通常将数字文字转换为枚举类型是毫无意义的。如果您知道您期望的值,您可以使用名称。这样,枚举就可以更改而不会破坏您的代码。我想可能会出现一些非常奇怪的情况,即某人已创建了一个枚举,并记录了“3”的含义,但没有记录它是哪个枚举值。但是那样的话,您需要修复API。
如果您想要在运行时将已知的整数值转换为枚举,则可能有助于序列化数据。只要您知道它在枚举范围内,结果就是定义好的。
如果您想要字符串“hi”,那么您无法获得它。与Java不同,在C++中,枚举类型中的值名称仅存在于编译时而不是运行时,并且只能进行单向映射。
你最好的选择可能是这样的:
enum Test{hi = 0, bye};
然后你可以简单地用数字0来引用“hi”,用数字1来引用“bye”。
虽然这实际上违背了使用枚举的初衷。
如果你期望返回的值是 {Hi 或 bye},那么你不能像那样获取该值。
我不建议这样做来获取实际值,但它可以被用作 hack。
string return_value(int index)
{
string temp = "";
switch (index)
{
case 1: temp = "hi"
break;
case 2: temp = "bye";
break;
defualt :
break;
}
return temp;
}
将类型转换为枚举类型会再次返回索引,但您可以将其分配给其他枚举变量
#include <iostream>
#define GENERATE_ENUM(ENUM) ENUM,
#define GENERATE_STRING(STRING) #STRING,
#define FOREACH_TEST(ID) ID(hi) ID(bye) ID(good)
enum TEST { FOREACH_TEST(GENERATE_ENUM) };
static const char * Test[] = { FOREACH_TEST(GENERATE_STRING) };
int main() {
printf("%s ",Test[0]);
printf("%s\n",Test[bye]);
for (int i=0; i<2; i++) printf("Test[%d] = %s\n", i, Test[i]); }