在两个枚举之间重载强制转换操作符

时间:2011-09-05 18:14:20

标签: c++ casting enums

有没有办法重载一个强制转换操作符以在两个枚举之间进行转换?

在我的代码中我有

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

enum dataStatus
{
    UNAVAILABLE = 1,
    DEGRADED,
    NORMAL
}

其中NOT_OPERATING和INITIALISING映射到UNAVAILABLE; DEGRADED和NORMAL直接映射。这些由外部接口修复。

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

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

我知道如果这些是课程,我可以写devStatus::operator dataStatus()来做这件事。有没有办法为枚举做这个?

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

1 个答案:

答案 0 :(得分:13)

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

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);