我想知道在C++中,如果我有一个枚举,我可以访问第二个索引的值吗?
enum Test{hi, bye};
如果我想要“hi”,我可以做类似Test[0]这样事情吗?谢谢。
u3r8eeie1#
是和否。如果您的枚举没有显式值,那么它是可能的。如果没有显式值,枚举值将按照声明顺序被赋予数字值0-N。例如...
enum Test { hi, // 0 bye // 1 }
这意味着索引只是转换成一个文本值。
Test EnumOfIndex(int i) { return static_cast<Test>(i); }
当然,这在运行时进行0验证,一旦你添加了一个显式值,它就会崩溃,但它在默认情况下仍然有效。
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); }
gjmwrych3#
枚举将名称Map到值。在您的示例中,(int)hi的值为0,(int)bye的值为1。您可以使用强制转换来获取hi的值:
int myInteger = 0; Test myValue = (Test)myInteger;
但是请注意,如果myInteger超出范围,myValue可能是无效的枚举值。
l7mqbcuq4#
不,但你可以从整型
Test test = (Test)0;
jm81lzqq5#
那要看你说“我想你好”是什么意思了。如果你的意思是你想要这个值,那么你可以像其他人说的那样,通过强制转换一个int来得到它。将一个数值类型转换为枚举类型通常是没有意义的--如果你知道你想要的是哪个值,你可以使用这个名称。这样,枚举就可以在不破坏你的代码的情况下改变。我想可能发生了一些非常奇怪的事情,有人创建了一个枚举,并记录了“3”的意思,但没有记录它是哪个枚举值。但是之后你会想要修复API。如果你已经序列化了数据,将一个运行时已知的整数值转换为枚举可能会很有帮助。只要你知道它在枚举的范围内,结果就被定义了。如果你想要字符串“hi”,那么你就不能拥有它。与Java不同,在C++中,枚举类型中的值的名称只存在于编译时,而不存在于运行时,并且只在一个方向上Map。
zf2sa74q6#
你最好的选择可能是这样的:
enum Test{hi = 0, bye};
那么你就可以简单地用数字0表示“hi”,用数字1表示“bye”。尽管这确实违背了最初使用枚举的全部目的。
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; }
类型转换为枚举将再次返回索引,但您可以将其赋值给其他枚举变量
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]结束
8条答案
按热度按时间u3r8eeie1#
是和否。如果您的枚举没有显式值,那么它是可能的。如果没有显式值,枚举值将按照声明顺序被赋予数字值0-N。例如...
这意味着索引只是转换成一个文本值。
当然,这在运行时进行0验证,一旦你添加了一个显式值,它就会崩溃,但它在默认情况下仍然有效。
bksxznpy2#
除非另有指定,否则枚举从0开始编号,每项递增1。
可以将int强制转换为枚举的类型以获取所需的值,例如:
它允许您执行以下操作:
gjmwrych3#
枚举将名称Map到值。在您的示例中,(int)hi的值为0,(int)bye的值为1。您可以使用强制转换来获取hi的值:
但是请注意,如果myInteger超出范围,myValue可能是无效的枚举值。
l7mqbcuq4#
不,但你可以从整型
jm81lzqq5#
那要看你说“我想你好”是什么意思了。
如果你的意思是你想要这个值,那么你可以像其他人说的那样,通过强制转换一个int来得到它。
将一个数值类型转换为枚举类型通常是没有意义的--如果你知道你想要的是哪个值,你可以使用这个名称。这样,枚举就可以在不破坏你的代码的情况下改变。我想可能发生了一些非常奇怪的事情,有人创建了一个枚举,并记录了“3”的意思,但没有记录它是哪个枚举值。但是之后你会想要修复API。
如果你已经序列化了数据,将一个运行时已知的整数值转换为枚举可能会很有帮助。只要你知道它在枚举的范围内,结果就被定义了。
如果你想要字符串“hi”,那么你就不能拥有它。与Java不同,在C++中,枚举类型中的值的名称只存在于编译时,而不存在于运行时,并且只在一个方向上Map。
zf2sa74q6#
你最好的选择可能是这样的:
那么你就可以简单地用数字0表示“hi”,用数字1表示“bye”。
尽管这确实违背了最初使用枚举的全部目的。
o8x7eapl7#
如果您希望返回的值为{Hi or bye},那么您就无法获得这样的值。
我不会建议这样做,以获得实际值,但它可以作为黑客使用
类型转换为枚举将再次返回索引,但您可以将其赋值给其他枚举变量
zpjtge228#
编译并运行:g++枚举测试. cpp-o枚举测试;./枚举测试输出:测试[0]结束=测试[1]结束