将一个枚举映射到另一个枚举

Map one enum to another enum

本文关键字:枚举 映射 另一个 一个      更新时间:2023-10-16

有一个现有的枚举

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;

还是有更好的方法?

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

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;

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

我可以想象您想要这样做的唯一原因是扩展现有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

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

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

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

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

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

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