我有一个枚举,但我希望它有一个赋值运算符,以便能够分配一个不是原始枚举的类型。 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
。有没有办法做到这一点?
答案 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;
}