有没有办法让 operator= 用于枚举?

Is there a way to have an operator= for an enum?

我有一个枚举,但我想要一个赋值运算符,以便它能够分配一个不是原始枚举的类型。例如

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。有没有办法做到这一点?

你不能,因为正如错误消息告诉你的那样,operator= 只能是非静态成员函数,而枚举不能有成员。如果你真的希望能够从不同的枚举中赋值,也许你应该将 Y 设为 class。另一种可能性是编写一个辅助函数来执行赋值。

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

#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';
}

您可以编写转换函数而不是转换运算符。无论如何,这是更好的形式,因为它在调用站点清楚地表达了意图。

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