使用没有变量名的枚举

RoR*_*RoR 32 c++

我理解第一个,但第二个?你何时以及为什么这样做?

enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE };

enum { HOMER, MARGE, BART, LISA, MAGGIE };
Run Code Online (Sandbox Code Playgroud)

dav*_*vka 29

你可以在一个类中定义这样的枚举,它给它一个范围,并有助于暴露类的功能,例如

class Encryption {
public:
  enum { DEFAUTL_KEYLEN=16, SHORT_KEYLEN=8, LONG_KEYLEN=32 };
  // ...
};

byte key[Encryption::DEFAUTL_KEYLEN];
Run Code Online (Sandbox Code Playgroud)

  • 现在我明白了,我想知道你是如何使用/访问它的.所以它通过执行ClassName :: enum值将它带入范围并使用它,因此基本上可以通过ClassName :: blah访问枚举{blah,hah,lol}等等.谢谢. (2认同)

Jac*_*kin 7

这只是创建具有相应值的常量表达式,而不是简单的类型int,因此您不能使用未命名的枚举作为任何类型的类型,您将不得不简单地接受a int然后与常量进行比较.

像这样的东西:

void doSomething(int c);
Run Code Online (Sandbox Code Playgroud)

这样的事情:

void doSomething(cartoon c);
Run Code Online (Sandbox Code Playgroud)

顺便说一下,你的实现是一样的,所以在未命名的枚举的情况下,唯一真正的缺点是强类型.


ice*_*ime 7

第二个是未命名的enum.当你需要字段时我会很有用,但你不打算声明这个枚举类型的变量.

为了提供一个"非常C++"的使用示例,您经常会在模板元编程中看到这一点,其中枚举被用作"编译时返回值",而无意声明此类型的变量:

template<class T>
struct some_metafunction
{
    enum { res = 0; };
};
Run Code Online (Sandbox Code Playgroud)


小智 7

我只是提供了一个现实生活中使用匿名枚举的示例,这是我在嵌入式项目中遇到的。项目中使用了 EEPROM 来存储一些参数。让我们假设这些参数是那些纸箱字符的年龄,每个参数在连续地址中的大小为 1 个字节。

当处理器上电时,这些参数被复制到存储在 ROM 中的数组中。

uint8_t ROM_AGE[END_AGE]
Run Code Online (Sandbox Code Playgroud)

如果我们在这里定义一个匿名枚举:

enum { HOMER_AGE, MARGE_AGE, BART_AGE, LISA_AGE, MAGGIE_AGE, END_AGE };
Run Code Online (Sandbox Code Playgroud)

那么 enum 中的关键字可以用来索引每个字符的年龄,比如ROM_AGE[HOMER_AGE]. 通过使用这个枚举,可读性比使用ROM_AGE[0].