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