On Sun, Mar 07, 2010 at 12:36:11AM +0000, Michal Minich wrote:
> I never used opAssign, but doesn't it solves this problem? Considering 
> that both opCall and opAssign work with "=" their interaction must be 
> probably quite complex...

opAssign only worked after the struct has been initialized.

===
import std.stdio;

struct S {
/*
        static S opCall(int a) {
                S tmp;
                writefln("opCall(%d);", a);
                return tmp;
        }
*/
        S* opAssign(int a) {
                writefln("opAssign(%d);", a);
                return &this;
        }
}

void main() {
        S a = 10; // Error: cannot implicitly convert expression (10) of type 
int to S
        a = 20;
        a(30);
}
===

Uncomment the opCall, and it compiles, outputting:
opCall(10);
opAssign(20);
opCall(30);


If you add a second opCall that is not static, but otherwise identical,
then it fails to compile either the first nor third lines, because:

c.d(19): Error: function c.S.opCall called with argument types:
        ((int))
matches both:
        c.S.opCall(int a)
and:
        c.S.opCall(int a)
c.d(21): Error: function c.S.opCall called with argument types:
        ((int))
matches both:
        c.S.opCall(int a)
and:
        c.S.opCall(int a)


(one being the static opCall, and the other of course being the instance one).


Pretty annoying. This is the #1 thing that got in my way of creating a
JavascriptObject struct right after opDispatch came out - emulating a
delegate and accepting assignment at declaration were mutually incompatible.

-- 
Adam D. Ruppe
http://arsdnet.net

Reply via email to