4

有一个现有的枚举

typedef enum
{
    myEnum_front = 11,
    myEnum_back = 19
} myEnumSides;

我想创建另一个枚举new_myEnumSides,它的值应该映射到myEnumSides. 因此,我将使用new_myEnumSides而不是myEnumSides. 下面的代码可以用于此目的吗?

typedef enum
{
    new_myEnum_front = myEnumSides::myEnum_front,
    new_myEnum_back = myEnumSides::myEnum_back
} new_myEnumSides;

或者,还有更好的方法?

4

3 回答 3

1

我无法想象你为什么需要这样做......如果你不需要重命名枚举的值,你可以只创建第一个变量的另一个变量,而不添加另一个枚举(我相信这不是你的情况下,但还是要指出这个机会):

typedef enum
{
    myEnum_front = 11,
    myEnum_back = 19
} myEnumSides, new_myEnumSides;//<-- just add the new variable here

如果您确实想重命名它(我相信这您的情况),则不应使用运算::符,而只需编写:

typedef enum
{
    myEnum_front = 11,
    myEnum_back = 19
} myEnumSides;

typedef enum
{
    new_myEnum_front = myEnum_front,
    new_myEnum_back = myEnum_back
} new_myEnumSides;

仅当::枚举位于类、结构或命名空间内时才应使用运算符,否则::不需要。

于 2012-09-05T12:28:24.480 回答
0

我能想象你想要这样做的唯一原因是扩展现有的enum并创建一个具有额外价值的新的。

由于enum不提供任何形式的继承,作为编译时间常量,实际上只是整数,你可以做这样的事情,虽然我不特别推荐它..

// internalEnums.h
myEnum_front = 11,
myEnum_back = 19

// customerEnums.h
someNewValue = 20,
someOtherNewValue = 21

// Wherever you want to define your enums
typedef enum
{
  #include "customerEnums.h"
} customerAccessible;

typedef enum
{
  #include "internalEnums.h"
  #include "customerEnums.h"
} internalUseOnly;

// Now there are two enumerations, sharing items.
customerAccessible::someNewValue // 11
customerAccessible::myEnum_front; // Doesn't exist

编辑根据您的评论,您可以通过将值保留在专门供外部使用的标头中来向客户公开枚举。

于 2012-09-05T12:38:41.503 回答
0

通常情况下,您不想公开第三方库的详细信息,但其中的枚举可能具有您需要的确切成员。

在这种情况下,为第三方创建映射是有益的enum,这样即使后端库发生更改,您也可以简单地自己提供枚举器。

最简洁的方法是创建一个别名:

using MyEnum = ThirdPartyEnum;
// {
//   enumerator1,
//   enumerator2
// }

这样,用户代码将不依赖第三方内部,您避免进行转换,即使第三方库被替换,您的用户也可以MyEnum通过简单地取消注释枚举器值来继续使用(我喜欢将它们保留在注释中,所以用户不必参考第三方库的文档。

于 2021-10-09T14:21:42.927 回答