枚举类型的复合赋值运算符重载

3

网络上有很多关于各种运算符重载的信息、示例等。但是我却找不到一个简单枚举类型且包含诸如|=+=等操作符重载的示例,真是苦恼。

按位或的实现如下:

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

我找到的所有复合操作的例子都是针对类的;类可以很容易地使用this指针作为左侧操作数。在枚举中,我没有这个选项,那么正确的语法是什么?

更新: 我已经尝试过以下版本:

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

代码可以编译通过,但是没有返回正确的按位或值。


相关帖子,https://dev59.com/62855IYBdhLWcg3wUCWC#4421729 - Niall
2
你可能想要查看例如这个参考链接。它会告诉你,确实将赋值表达式的左侧作为函数的第一个参数。如果需要更多信息,你也可以阅读这个链接 - Some programmer dude
关于您的更新,请再次阅读我的链接参考,以了解参数和返回类型是什么。希望这能告诉您更多需要做什么的信息。同时,考虑如何重载输出和输入运算符,它们在参数和应该返回的内容方面有些相似(当然执行不同的操作)。 - Some programmer dude
你提供的参考资料很好。我之前在cppreference.com上搜索过,但没有找到那个页面。它只缺少一个必要的东西:一个示例来查看函数体中的细节。如果没有对a进行赋值,代码就无法编译。 - Mike Lischke
1个回答

5
根据您的更新,需要对实现和签名进行微调;
inline MyEnum& operator |= (MyEnum& a, MyEnum b)
//           ^ here and           ^ here
{
  return a = (MyEnum)((int)a | (int)b);
}

为了使操作按预期工作,重要的是签名与内置签名相一致,并且通常建议实现也相一致。可以从评论中列出的参考文献中获取签名(在此情况下,规范的签名是T1& operator |= (T1& lhs, T2 const& rhs))。
这里的引用(MyEnum&)很重要(特别是对于MyEnum& a),以便运算符的行为就像内置的一样,并且这就是你所期望的。 请注意返回类型,返回类型可以是任何类型,甚至是void。这将影响编译器能够编译的内容。例如,使用上面的返回类型,MyEnum c = (a |= b);会被编译。如果返回类型是void,则不会编译,但a |= b;仍然会编译。建议返回类型与内置类型匹配,这将给您更自然的语义。

从来没有想过使用引用,更重要的是在返回调用时使用赋值(否则会出现编译器错误)。顺便说一句:关于返回类型的解释很好! - Mike Lischke
返回语句中的赋值实际上只是一种简写方式,也可以写成 a = (MyEnum)...); return a; - Niall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接