opXAssign overloading

Bill Baxter wbaxter at gmail.com
Tue Oct 13 11:29:34 PDT 2009


On Tue, Oct 13, 2009 at 2:30 AM, Don <nospam at nospam.com> wrote:
> Robert Jacques wrote:
>>
>> On Tue, 13 Oct 2009 00:31:32 -0400, dsimcha <dsimcha at yahoo.com> wrote:
>>
>>> It seems that D's operator overloading is a bit silly in some cases
>>> w.r.t.
>>> opAddAssign, opSubAssign, etc.  Consider the following example:
>>>
>>> struct Foo {
>>>    Foo opAdd(Foo rhs) {
>>>        return this;
>>>    }
>>> }
>>>
>>> void main() {
>>>    Foo foo;
>>>    Foo bar;
>>>    foo = foo + bar;  // Works.
>>>    foo += bar;  // Doesn't work.
>>> }
>>>
>>> I'm thinking (not sure if this was proposed here before a while back and
>>> I
>>> just forgot where I heard it from) that the default behavior of
>>> someObject.opXAssign(otherStuff); should be to expand into someObject =
>>> someObject.opX(otherStuff); if opXAssign is not overloaded.  Besides the
>>> programmer being too lazy to explicitly overload opXAssign, I just found
>>> another use case.
>>>
>>> Suppose you have a bunch of classes and you're overloading operators such
>>> that
>>> each call builds another layer of decorators.  For example:
>>>
>>> class SomeClass {
>>>    SomeClass opAdd(SomeClass rhs) {
>>>       // SomeDecorator is a subclass of SomeClass.
>>>       return new SomeDecorator(this, rhs);
>>>    }
>>> }
>>>
>>> In this case, you *can't* overload SomeClass.opAddAssign in any
>>> reasonable way
>>> because you can't assign SomeDecorator to this, but translating
>>> someInstance.opAddAssign(someOtherInstance) into someInstance =
>>> someInstance.opAdd(someOtherInstance) makes perfect sense.
>>
>
>> Also, if you template both opX and opX_r you will always get a overload
>> conflict.
>
> Yes, I posted a patch for that to the ng. It's very simple.
>
>
> There has been some discussion as to whether arithmetic operator overloading
> makes sense at all for reference types. My feeling is that if  x = x + y;
> has a different meaning to x += y; then operator overloading doesn't make
> sense.
>
> But, perhaps with the decorator idea you are close to having a use case for
> classes where operator overloading makes sense?

Well, I have implemented an N-d array-like type as a class before.
I don't think it's the best way to do it, but someone might like to
have a general array class they could override to behave as a matrix.
There is such a thing in Numpy.  I don't think it's the greatest idea
in the world, but if you do make such a thing, then you want to be
able to make += identity preserving and = not.   And that's how stuff
works in Python in general.   += modifies an object,  = changes its
identity.    So I wouldn't say it's nonsense to have such a rule.
What you can say is that this better be true (to within numerical
precision)

x1 = x + y
x += y
 ==>  x1 == x

--bb
x+



More information about the Digitalmars-d mailing list