我有一个枚举,但我想为它添加一个赋值运算符,以便能够分配一个不属于原始枚举的类型。例如:
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 ='必须是非静态成员
的错误。有没有办法解决这个问题?
我有一个枚举,但我想为它添加一个赋值运算符,以便能够分配一个不属于原始枚举的类型。例如:
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 ='必须是非静态成员
的错误。有没有办法解决这个问题?
operator=
只能是非静态成员函数,而枚举类型不能有成员。如果你真的想要从不同的枚举类型中进行赋值,也许你应该把Y
变成一个类。另一种可能性是编写帮助函数来执行赋值操作。Y
变成一个类可能会在类型方面带来更多麻烦... - Adrianclass ByteX { enum X { A, ... }; }; class WordX { enum X { A, ... }; }; class DWordX { enum X { A, ... }; }; void fn() { DWordX x = WordX::X::A; }
. 或者我想它们都可以引用Byte的那个,或者将Byte枚举定义为外部枚举... - Adrian枚举类是一种繁琐的结构,您可以避免使用。只需将旧的枚举包装在一个结构体中:
#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;
}
X
到类型 Y
,然后再返回。它们表示相同的信息,但大小不同。它们永远不会互相溢出。没有任何理由不将其视为隐式转换。 - Adrianclass
,带有转换和赋值运算符。 - Spencer
enum class
,我猜这是您进行的修改。是这样吗?如果是这样,那么是否接受一些不使用enum class
的替代方案呢? - user743382int
和char
,甚至没有枚举。 - Adrianenum class
,因为你可以不使用它来达到你想要的效果。 - user743382