C++中通过索引获取枚举值

25

我在C++中想知道,如果我有一个枚举,我是否可以访问第二个索引处的值?例如,我有

enum Test{hi, bye};
如果我想要“hi”,我能像 Test[0] 这样做吗,谢谢。

不行。但是如果您提供一个使用案例,可能会有好的替代方案。 - unwesen
一个简单的数组就可以提供这个功能。 - Gavin Ray
8个回答

32

是与否。如果你的枚举类型没有明确的值,那么是可能的。没有明确值的情况下,枚举值会按照声明顺序从0到N被赋予数值。例如...

enum Test {
  hi, // 0
  bye // 1
}

这意味着索引只是将一个字面值翻译成另一个字面值。

Test EnumOfIndex(int i) { return static_cast<Test>(i); }

当然,这种方法在运行时不进行任何验证,一旦添加了显式值就会出错。但是在默认情况下它可以工作。


17

除非另有说明,枚举从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);
}

13
请使用 static_cast<Test>(i) 替代 (Test)i。 - jab
关于为什么:正如Glen的回答中所提到的, static_cast<T>()是C++风格的转换,由编译器检查,而C风格的转换则不会被检查,可能在运行时失败。此外,您明确告诉程序员您的意图。 另一方面,在C++中使用C风格的转换被定义为如果其中一个类型是另一个类型的基类,则其效果与static_cast相同,否则它使用reinterpret_cast。在您的情况下,这不会破坏任何东西。如果可能的话,在C++中使用现代C++是更好的实践。 - Baron von Hoot

3

枚举将名称映射到值。在您的情况下,(int)hi的值为0,(int)bye的值为1。您可以使用强制转换来获取hi的值:

int myInteger = 0;
Test myValue = (Test)myInteger;

请注意,如果myInteger超出范围,则myValue可能是无效的枚举值。

2
不可以,但是你可以从int类型进行转换。
Test test = (Test)0;

这是一个非常糟糕的想法,因为你不能保证这些值是正确的索引。 - Chuck Claunch

1

“我想要 'hi'”有不同的解释。

如果你想要值,那么你可以像其他人所说的那样将其转换为int来获取它。

通常将数字文字转换为枚举类型是毫无意义的。如果您知道您期望的值,您可以使用名称。这样,枚举就可以更改而不会破坏您的代码。我想可能会出现一些非常奇怪的情况,即某人已创建了一个枚举,并记录了“3”的含义,但没有记录它是哪个枚举值。但是那样的话,您需要修复API。

如果您想要在运行时将已知的整数值转换为枚举,则可能有助于序列化数据。只要您知道它在枚举范围内,结果就是定义好的。

如果您想要字符串“hi”,那么您无法获得它。与Java不同,在C++中,枚举类型中的值名称仅存在于编译时而不是运行时,并且只能进行单向映射。


0

你最好的选择可能是这样的:

enum Test{hi = 0, bye};

然后你可以简单地用数字0来引用“hi”,用数字1来引用“bye”。

虽然这实际上违背了使用枚举的初衷。


0

如果你期望返回的值是 {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;
}

将类型转换为枚举类型会再次返回索引,但您可以将其分配给其他枚举变量


0
#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]); }

编译并运行代码:g++ enum-test.cpp -o enum-test; ./enum-test 输出: hi bye Test[0] = hi Test[1] = bye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接