Thread overview
Compound assignment operators
Aug 26, 2010
Yao G.
Aug 26, 2010
Yao G.
Aug 26, 2010
bearophile
Aug 26, 2010
Jonathan M Davis
Aug 26, 2010
Yao G.
Aug 26, 2010
Jonathan M Davis
August 26, 2010
Is there a way to make compound assignment operators (-=, +=, *= and friends) work with D's operator overload regime? I can't make them work.

> struct Foo
> {
>     this( int foo )
>     Foo opBinary(string op)( in typeof(this) rhv )
>     if( op == "-=" )
>     {
>          _bar -= rhv._bar;
>          return this;
>     }
>
>     private int _bar;
> }
>
> void main()
> {
>     au

-- 
Yao G.
August 26, 2010
Sorry, I sent the message prematurely :( Anyway, here's complete:

Is there a way to make compound assignment operators (-=, +=, *= and
friends) work with D's operator overload regime? I can't make them work.

> struct Foo
> {
>     this( int bar ) {
>          bar = bar;
>     }
>
>     Foo opBinary(string op)( in typeof(this) rhv )
>     if( op == "+=" )
>     {
>          _bar += rhv._bar;
>          return this;
>     }
>
>     private int _bar;
> }
>
> void main()
> {
>     auto f1 = Foo(1);
>     auto f2 = Foo(2);
>     f2 += f1;

I get the following compiler error:

> Error: 'f1' is not a scalar, it is a Foo
> Error: 'f1' is not of arithmetic type, it is a Foo
> Error: 'f2' is not of arithmetic type, it is a Foo

Is there a way to make this work? Even changing the operator string in opBinary to "-" doesn't do nothing. Or those kind of operators can't be overloaded?

-- 
Yao G.
August 26, 2010
Yao G.:
> Is there a way to make this work? Even changing the operator string in opBinary to "-" doesn't do nothing. Or those kind of operators can't be overloaded?

Try opOpAssign.

Bye,
bearophile
August 26, 2010
On Wednesday 25 August 2010 22:31:38 Yao G. wrote:
> Sorry, I sent the message prematurely :( Anyway, here's complete:
> 
> Is there a way to make compound assignment operators (-=, +=, *= and friends) work with D's operator overload regime? I can't make them work.

Look at http://www.digitalmars.com/d/2.0/operatoroverloading.html (or even better, TDPL). The correct function would be opOpAssign. I believe that the syntax for += would be

opOpAssign!("+")(args) { }

- Jonathan M Davis
August 26, 2010
On Thu, 26 Aug 2010 01:46:02 -0500, Jonathan M Davis <jmdavisprog@gmail.com> wrote:

> Look at http://www.digitalmars.com/d/2.0/operatoroverloading.html (or even
> better, TDPL). The correct function would be opOpAssign. I believe that the
> syntax for += would be
>
> opOpAssign!("+")(args) { }
>
> - Jonathan M Davis

Ha ha ha! What a shame, I was reading that page looking for a solution, but it seems that I just skipped that part. Thanks and sorry for the stupid question.


-- 
Yao G.
August 26, 2010
On Wednesday 25 August 2010 23:49:27 Yao G. wrote:
> On Thu, 26 Aug 2010 01:46:02 -0500, Jonathan M Davis
> 
> <jmdavisprog@gmail.com> wrote:
> > Look at http://www.digitalmars.com/d/2.0/operatoroverloading.html (or
> > even
> > better, TDPL). The correct function would be opOpAssign. I believe that
> > the
> > syntax for += would be
> > 
> > opOpAssign!("+")(args) { }
> > 
> > - Jonathan M Davis
> 
> Ha ha ha! What a shame, I was reading that page looking for a solution, but it seems that I just skipped that part. Thanks and sorry for the stupid question.

Yeah, well. It's a sparse page, and that section is quite small, so it's pretty easy to miss. Really, at this point, TDPL is the place to go to look stuff up unless it's Phobos-specific stuff.

- Jonathan M Davis