【问题标题】:C++: Is it possible to overload the | operator on two different enums residing inside the same class?C++:是否可以重载 |驻留在同一类中的两个不同枚举上的运算符?
【发布时间】:2015-12-14 18:19:12
【问题描述】:
class myClass
{
    enum firstEnum { Value1, Value2, Value3};
    enum secondEnum { ValueA, ValueB, ValueC};
};

我想重载 |上面两个枚举的运算符。有可能吗?

注意这里有两个枚举,而不仅仅是一个,我想重载 |两者兼得。

谢谢。

【问题讨论】:

标签: c++ enums operator-overloading operators overloading


【解决方案1】:

是的,就像常规函数一样,您可以为不同类型的参数重载运算符

#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)
}

Live Example.

但要小心老式的enum,它们会隐式转换为整数类型,因此对operator| 的混合调用将调用int 上的内置operator|。使用 C++11 enum class 获得更多类型安全的行为。

更新:上面的代码也可以为 C++98 编译,只是 C++11 提供了更多类型安全的枚举。

【讨论】:

  • 不幸的是,我使用的是 C++98,所以我不能使用枚举类。感谢您的回答。
  • @Yanniel 他没有使用enum class。他正在使用具有enumclass,它符合C++98。 here 是 C++98 编译中的实时示例
  • 是的,TemplateRex 的解决方案适用于 C++98;但他也说“使用枚举类来获得更多类型安全的行为”,因此我之前的评论。
  • @NathanOliver 更新以避免混淆 c++98。
猜你喜欢
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
相关资源
最近更新 更多