2014-09-03 51 views
3

有很多信息,例子等,用于运算符在Web上重载所有类型。但我不能在我的生活中找到一个例子,说明如何为简单的枚举操作,例如|=+=操作符。运算符在枚举上为组合赋值运算符重载

对于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

Related posts,http://stackoverflow.com/a/4421729/3747990 – Niall 2014-09-03 13:52:03

+2

你可能想检查例如[this reference](http://en.cppreference.com/w/cpp/language/operator_assignment)。它会告诉你,你确实在赋值表达式的左边,在函数的第一个参数中。有关更多信息,您可能还需要[阅读本文](http://en.cppreference.com/w/cpp/language/operators)。 – 2014-09-03 13:52:11

+0

关于你的更新,请再次阅读[我的链接引用](http://en.cppreference.com/w/cpp/language/operator_assignment)来查看参数和返回类型是什么。希望这应该告诉你更多你需要做的事情。还要考虑你如何重载输出和输入操作符,当涉及到参数和你应该返回的东西时它们是相似的(但当然做不同的事情)。 – 2014-09-03 14:06:33

回答

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;仍然会编译。建议返回匹配内置的返回,因为这会给你更自然的语义。

+0

永远不会有想法使用引用,但更重要的是使用返回调用的分配(否则我得到一个编译器错误)。顺便说一句:关于返回类型的很好的解释! – 2014-09-04 06:55:04

+0

返回中的赋值实际上只是简写,它也可能是'a =(MyEnum)...);返回一个;' – Niall 2014-09-04 07:12:15