c++ - 在两个枚举之间重载转换运算符

标签 c++ casting enums

有没有办法重载转换运算符以在两个枚举之间进行转换?

在我的代码中有

enum devStatus
{
    NOT_OPERATING,
    INITIALISING,
    DEGRADED,
    NORMAL
};

enum dataStatus
{
    UNAVAILABLE = 1,
    DEGRADED,
    NORMAL
}

其中 NOT_OPERATING 和 INITIALISING 映射到 UNAVAILABLE; DEGRADED 和 NORMAL map 直接穿过。这些由外部接口(interface)固定。

我正在寻找一种在 devStatusdataStatus 之间进行转换的方法,并且希望能够编写如下内容:

devStatus devSts;
getDeviceStatus(&devSts);
dataStatus dataSts = (dataStatus)devSts;

我知道如果这些是类,我可以编写 devStatus::operator dataStatus() 来执行此操作。有没有办法对枚举执行此操作?

我可以有一个免费的功能 dataStatus devStatus2dataStatus(const devStatus& desSts)

最佳答案

在 C++ 中,转换运算符只能在类、结构和 union 声明中声明。它们不能在类型之外声明(例如 operator+)。枚举类型声明不支持实例成员,因此您需要使用转换函数。这样做也会让调用代码更加清晰。以下示例演示了这一点,使用自定义命名空间来限定枚举和转换函数的范围:

namespace TheirEnum {
   enum Type {
      Value1,
      Value2
   };
}
namespace MyEnum {
   enum Type {
      Value1,
      Value2
   };

   TheirEnum::Type ToTheirEnum (Type e) {
      switch (e) {
         case Value1: return TheirEnum::Value1;
         case Value2: return TheirEnum::Value2;
         default: throw std::invalid_argument("e");
      }
   }
}

// usage:
TheirEnum::Type e = MyEnum::ToTheirEnum(MyEnum::Value1);

关于c++ - 在两个枚举之间重载转换运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7311477/

相关文章:

c# - 如何在C#中将Linq Select Enumerable转换为首选类型?

javascript - 如何从 Google Apps 脚本 ContactsApp.Month 枚举获取第三个值

c# - 根据枚举名称动态查找枚举值

c - 在 C 中使用枚举而不是#defines 作为编译时常量是否合理?

c++ - 为什么我们在冒泡排序算法中进行 n-1 次迭代

c++ - 在不同的线程中停止无限循环

c++ - std::set 需要多少额外内存(如果有的话)来存储它的元素 v.s.一个 std::vector?

c++ - googletest架构x86_64错误的 undefined symbol

java - 强制转换:为什么子类属性在分配给父类(super class)变量时变得不可访问?

sql - PostgreSQL:将两个单独的数值转换为一个点