网上有各种各样的运营商重载信息,例子等。但我不能为我的生活找到一个关于如何为简单的枚举,例如|=
或+=
运算符执行此操作的示例。
对于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
值。
答案 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;
仍会编译。建议返回与内置的匹配,因为这将为您提供更自然的语义。