C++:是否可以重载 |位于同一 class 内的两个不同枚举的运算符?
C++: Is it possible to overload the | operator on two different enums residing inside the same class?
class myClass
{
enum firstEnum { Value1, Value2, Value3};
enum secondEnum { ValueA, ValueB, ValueC};
};
我想超载 |上面两个枚举的运算符。可能吗?
注意这里有两个枚举,不只是一个,我想重载 |对于两者。
谢谢。
是的,就像对常规函数所做的一样,您可以重载 不同类型参数的运算符
#include <iostream>
struct myClass
{
enum firstEnum { Value1, Value2, Value3};
enum secondEnum { ValueA, ValueB, ValueC};
friend void operator|(firstEnum L, firstEnum R) { std::cout << "first\n"; }
friend void operator|(secondEnum L, secondEnum R) { std::cout << "second\n"; }
};
int main()
{
myClass::Value1 | myClass::Value2; // first
myClass::ValueA | myClass::ValueB; // second
myClass::Value1 | myClass::ValueA; // prints nothing, converts enums to builtin operator|(int, int)
}
但要小心老式的 enum
,它们会隐式转换为整数类型,因此对 operator|
的混合调用将调用 int
上的内置 operator|
.使用 C++11 enum class
以获得更多类型安全行为。
更新:上面的代码也可以为C++98编译,只是C++11提供了更多类型安全的枚举。
class myClass
{
enum firstEnum { Value1, Value2, Value3};
enum secondEnum { ValueA, ValueB, ValueC};
};
我想超载 |上面两个枚举的运算符。可能吗?
注意这里有两个枚举,不只是一个,我想重载 |对于两者。
谢谢。
是的,就像对常规函数所做的一样,您可以重载 不同类型参数的运算符
#include <iostream>
struct myClass
{
enum firstEnum { Value1, Value2, Value3};
enum secondEnum { ValueA, ValueB, ValueC};
friend void operator|(firstEnum L, firstEnum R) { std::cout << "first\n"; }
friend void operator|(secondEnum L, secondEnum R) { std::cout << "second\n"; }
};
int main()
{
myClass::Value1 | myClass::Value2; // first
myClass::ValueA | myClass::ValueB; // second
myClass::Value1 | myClass::ValueA; // prints nothing, converts enums to builtin operator|(int, int)
}
但要小心老式的 enum
,它们会隐式转换为整数类型,因此对 operator|
的混合调用将调用 int
上的内置 operator|
.使用 C++11 enum class
以获得更多类型安全行为。
更新:上面的代码也可以为C++98编译,只是C++11提供了更多类型安全的枚举。