Don wrote:
Don wrote:
There's been some interesting discussion about operator overloading
over the past six months, but to take the next step, I think we need
to ground it in reality. What are the use cases?
I think that D's existing opCmp() takes care of the plethora of
trivial cases where <, >= etc are overloaded. It's the cases where the
arithmetic and logical operations are overloaded that are particularly
interesting to me.
The following mathematical cases immediately spring to mind:
* complex numbers
* quaternions
* vectors
* matrices
* tensors
* bigint operations (including bigint, bigfloat,...)
I think that all of those are easily defensible.
But I know of very few reasonable non-mathematical uses.
In C++, I've seen them used for iostreams, regexps, and some stuff
that is quite frankly bizarre.
So, please post any use cases which you consider convincing.
Some observations based on the use cases to date:
(1)
a += b is ALWAYS a = a + b (and likewise for all other operations).
opXXXAssign therefore seems to be a (limited) performance optimisation.
The compiler should be allowed to synthesize += from +. This would
almost halve the minimum number of repetitive functions required.
<snip>
I thought it did. I must've been imagining it. But the really silly
thing is that, for classes, it seems you can't even make a += b behave
as a = a + b, i.e. reassigning the reference a. Consequently, having
op= on an immutable big integer class is out of the question. There was
a proposal that I supported a while back - see
http://www.digitalmars.com/d/archives/digitalmars/D/announce/DMD_0.177_release_6132.html#N6150
and followups. The same would work for opXXXAssign (albeit not static).
In short, the way it could be made to work is:
- If a.opAddAssign(b) exists and returns something, make a += b
equivalent to a = a.opAddAssign(b)
- If a.opAddAssign(b) exists and returns void, make a += b equivalent to
(a.opAddAssign(b), a)
(this is a bit like another of my too-much-ignored proposals
http://www.digitalmars.com/d/archives/digitalmars/D/10199.html )
- Otherwise, make a += b equivalent to a = a + b.
Of course, the expression represented by a would be evaluated only once
in each case.
Stewart.