Operator overloading -- lets collect some use cases

Stewart Gordon smjg_1998 at yahoo.com
Wed Dec 31 05:03:07 PST 2008


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.



More information about the Digitalmars-d mailing list