Can a member function return a delegate to itself?

teales steve.teale at britseyeview.com
Wed May 23 21:34:20 PDT 2007


teales Wrote:

> BCS Wrote:
> 
> > Steve Teale wrote:
> > > Something like:
> > > 
> > > class Foo
> > > {
> > >     int a;
> > > 
> > >     this() { a = 0; }
> > > 
> > >     void delegate(int) sum(int n) 
> > >               { a += n; return cast(void delegate(int)) &this.sum; }
> > > }
> > 
> > as mentioned, the reason this isn't directly doable is that the type is 
> > undefinable. However this is strictly a limitation of the D Syntax and 
> > their is no problem with actually doing it if you can tell DMD how. I 
> > have does this using typing tricks before:
> > 
> > 
> > struct S
> > {
> > 	S delegate(int,int) dg;
> > }
> > 
> > struct O
> > {
> > 	int k;
> > 	S go(int i, int j)
> > 	{
> > 		O* o = new O
> > 		o.k = k+i+j;
> > 		S ret;
> > 		ret.dg = &o.go;
> > 		return ret;
> > 	}
> > }
> 
> I also think your solution is nifty. So the answer to my question is rather like what you suggested, but you have to add an opCall to S, as in:
> 
> import std.stdio;
> 
> struct S
> {
>         S delegate(int) dg;
>         S opCall(int n) { dg(n); return *this; }
> }
> 
> struct O
> {
>         int a;
>         S sum(int i)
>         {
>                 a += i;
>                 S ret;
>                 ret.dg = ∑
>                 return ret;
>         }
> }
> 
> 
> void main(char[][] args)
> {
>    O o;
>    o.sum(1)(2)(3);
>    writefln("%d", o.a); // prints 6 as desired
> }
> 
> It was just a curious question in the first place but you never know, somebody might find a use for it.

Hmm, interesting, the system converted ret.dg = & s u m ; (ignore the spaces) to the math summation character



More information about the Digitalmars-d mailing list