有没有办法让operator = for enum?

时间:2016-04-04 20:26:44

标签: c++ c++11 enums operator-overloading assignment-operator

我有一个枚举,但我希望它有一个赋值运算符,以便能够分配一个不是原始枚举的类型。 E.g。

enum class X : int
{
  A, B, C, D
}

enum class Y : char
{
  A, B, C, D
}

Y& operator=(Y& lhs, X rhs)
{
  return Y = static_cast<Y>(X);
}

但我得到'operator =' must be a non-static member。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:7)

您不能因为,正如错误消息所示,expect(scope.aMethod).toBe(jasmine.any(Function)); 只能是非静态成员函数,而枚举不能拥有成员。如果你真的希望能够从不同的枚举中分配,也许你应该让operator=成为一个类。另一种可能性是编写辅助函数来执行赋值。

答案 1 :(得分:3)

枚举类是一种可以避免的繁琐结构。只需将旧枚举包装在结构中:

#include <iostream>

struct X
{
  enum enum_type { A, B, C, D };
  typedef int value_type;
  value_type value;

  X(enum_type value) : value(value) {}
  operator enum_type () const { return static_cast<enum_type>(value); }
};

struct Y
{
  enum enum_type { A, B, C, D };
  typedef char value_type;
  value_type value;

  Y(enum_type value) : value(value) {}
  operator enum_type () const { return static_cast<enum_type>(value); }

  Y& operator = (X rhs) {
    value = rhs;
    return *this;
  }
};

int main()
{
    X x = X::A;
    Y y = Y::B;
    std::cout << y << '\n';
    y = x;
    std::cout << y << '\n';
}

答案 2 :(得分:0)

您可以编写转换函数而不是转换运算符。在任何情况下,这都是更好的形式,因为它在呼叫站点清楚地表达了意图。

enum class X : int
{
    A, B, C, D
};

enum class Y : char
{
    A, B, C, D
};

Y to_y(X rhs)
{
    auto as_int = static_cast<int>(rhs);  // allowed
    auto as_char = static_cast<char>(as_int); // allowed if the int is known to fit
    return static_cast<Y>(as_char); // allowed if the char is known to be the right value
}

int main()
{
    auto x = X::C;

    auto y = to_y(x);

    return 0;
}