枚举器上复合赋值运算符的运算符重载

时间:2014-09-03 13:45:07

标签: c++ enums

网上有各种各样的运营商重载信息,例子等。但我不能为我的生活找到一个关于如何为简单的枚举,例如|=+=运算符执行此操作的示例。

对于bitwise or,实现是这样的:

  inline MyEnum operator | (MyEnum a, MyEnum b)
  {
    return (MyEnum)((int)a | (int)b);
  }

我在复合操作中找到的所有例子都是针对类的;它可以很容易地获取LHS的this指针。在枚举中,我没有这个,那么正确的语法是什么?

更新:我已经尝试过这个版本:

  inline MyEnum operator |= (MyEnum a, MyEnum b)
  {
    return (MyEnum)((int)a | (int)b);
  }

并且它会编译,但不会返回正确的bitwise or值。

1 个答案:

答案 0 :(得分:5)

根据您的更新,实施和签名需要稍微调整一下;

inline MyEnum& operator |= (MyEnum& a, MyEnum b)
//           ^ here and           ^ here
{
  return a = (MyEnum)((int)a | (int)b);
}

为了使操作按预期工作,重要的是签名与内置的相关联,并且通常会建议实现也相关联。可以从评论中列出的reference获取签名(本案例中的规范为T1& operator |= (T1& lhs, T2 const& rhs)

这里的引用(MyEnum&)很重要(特别是对于MyEnum& a),这样运算符就像内置的一样,这就是你期望它的方式。

请注意返回类型;返回类型可以是任何类型,甚至是void。这会影响可以编译的内容。例如,使用上面的返回类型,MyEnum c = (a |= b);将编译。如果返回void,则不会,但a |= b;仍会编译。建议返回与内置的匹配,因为这将为您提供更自然的语义。