枚举C++按索引获取

deikduxw  于 2023-02-14  发布在  其他
关注(0)|答案(8)|浏览(281)

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

enum Test{hi, bye};

如果我想要“hi”,我可以做类似Test[0]这样事情吗?谢谢。

u3r8eeie

u3r8eeie1#

是和否。如果您的枚举没有显式值,那么它是可能的。如果没有显式值,枚举值将按照声明顺序被赋予数字值0-N。例如...

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

这意味着索引只是转换成一个文本值。

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

当然,这在运行时进行0验证,一旦你添加了一个显式值,它就会崩溃,但它在默认情况下仍然有效。

bksxznpy

bksxznpy2#

除非另有指定,否则枚举从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);
}
gjmwrych

gjmwrych3#

枚举将名称Map到值。在您的示例中,(int)hi的值为0,(int)bye的值为1。您可以使用强制转换来获取hi的值:

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

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

l7mqbcuq

l7mqbcuq4#

不,但你可以从整型

Test test = (Test)0;
jm81lzqq

jm81lzqq5#

那要看你说“我想你好”是什么意思了。
如果你的意思是你想要这个值,那么你可以像其他人说的那样,通过强制转换一个int来得到它。
将一个数值类型转换为枚举类型通常是没有意义的--如果你知道你想要的是哪个值,你可以使用这个名称。这样,枚举就可以在不破坏你的代码的情况下改变。我想可能发生了一些非常奇怪的事情,有人创建了一个枚举,并记录了“3”的意思,但没有记录它是哪个枚举值。但是之后你会想要修复API。
如果你已经序列化了数据,将一个运行时已知的整数值转换为枚举可能会很有帮助。只要你知道它在枚举的范围内,结果就被定义了。
如果你想要字符串“hi”,那么你就不能拥有它。与Java不同,在C++中,枚举类型中的值的名称只存在于编译时,而不存在于运行时,并且只在一个方向上Map。

zf2sa74q

zf2sa74q6#

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

enum Test{hi = 0, bye};

那么你就可以简单地用数字0表示“hi”,用数字1表示“bye”。
尽管这确实违背了最初使用枚举的全部目的。

o8x7eapl

o8x7eapl7#

如果您希望返回的值为{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;
}

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

zpjtge22

zpjtge228#

#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++枚举测试. cpp-o枚举测试;./枚举测试输出:测试[0]结束=测试[1]结束

相关问题