有没有办法让 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;
}
我有一个枚举,但我想要一个赋值运算符,以便它能够分配一个不是原始枚举的类型。例如
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;
}