【问题标题】:Map one enum to another enum将一个枚举映射到另一个枚举
【发布时间】:2012-09-05 12:24:29
【问题描述】:

有一个现有的枚举

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 myEnumSides { .... };。此外,:: 语法仅适用于 C++11 类枚举。 C++03 枚举值令人讨厌地存在于全局命名空间中。

标签: c++ enums


【解决方案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;

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

【讨论】:

  • 第一个示例具有误导性,因为它不会将一个枚举的值转换为另一个。它为同一个无名枚举创建两个 typedef。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      • 2014-10-09
      相关资源
      最近更新 更多