23

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

enum Test{hi, bye};

如果我想要“嗨”,我可以做一些类似 Test[0] 的事情吗,谢谢。

4

7 回答 7

32

是和不是。如果您的 Enum 没有明确的值,那么它是可能的。如果没有明确的值,枚举值会按照声明的顺序被赋予数值 0-N。例如 ...

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

这意味着索引只是转换为文字值。

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

这当然会在运行时进行 0 验证,并且一旦添加了显式值,它就会崩溃。但它会在默认情况下工作。

于 2008-11-26T19:13:57.120 回答
15

除非另有说明,否则枚举从 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);
}
于 2008-11-26T19:14:45.807 回答
3

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

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

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

于 2008-11-26T19:12:54.220 回答
2

不,但你可以从 int 转换

Test test = (Test)0;
于 2008-11-26T19:13:18.460 回答
1

取决于您所说的“我想要'嗨'”是什么意思。

如果你的意思是你想要这个值,那么你可以通过转换一个 int 来获得它,就像其他人所说的那样。

将数字文字转换为枚举类型通常是没有意义的 - 如果您知道您期望哪个值,您可以使用该名称。这样,枚举可以在不破坏代码的情况下进行更改。我想可能发生了一些非常奇怪的事情,有人创建了一个枚举,并记录了“3”的含义,但没有记录它是哪个枚举值。但是你会想要修复 API。

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

如果你的意思是你想要字符串“hi”,那么你就不能拥有它。与 Java 不同,在 C++ 中,枚举类型中的值的名称只存在于编译时,而不是运行时,并且只映射到一个方向。

于 2008-11-26T19:42:07.093 回答
0

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

enum Test{hi = 0, bye};

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

尽管这确实违背了首先使用枚举的全部目的。

于 2008-11-26T19:13:50.347 回答
0

如果您将返回的值排除为 {Hi or bye} ,那么您将无法获得这样的值。

我不建议这样做以获得实际价值,但它可以用作黑客

string return_value(int index)
{
string temp = "";
switch (index)
{
case 1: temp = "hi"
break;
case 2: temp = "bye";
break;
defualt :
break;
}
return temp;
}

对枚举进行类型转换将再次返回索引,但您可以分配给其他一些枚举变量

于 2017-02-02T13:54:32.073 回答