Operator overloading -- lets collect some use cases
nospam at nospam.com
Wed Dec 31 07:25:12 PST 2008
Stewart Gordon wrote:
> 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:
>> 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
> 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.
Yuck! That's good to know.
> a proposal that I supported a while back - see
> 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.
More information about the Digitalmars-d