On Thu, 13 Jan 2011 17:14:13 +0000, %u wrote: > == Quote from Simen kjaeraas (simen.kja...@gmail.com)'s article >> %u <e...@ee.com> wrote: >> > I only need something to make a void deleg() from a void func(). >> This works for me: >> ReturnType!( F ) delegate( ParameterTypeTuple!( F ) ) toDelegate( F )( >> F fn ) { >> return ( ParameterTypeTuple!( F ) args ){ return fn( args ); }; >> } > > What am I doing wrong. I can't call the delegate twice with anything in > between. > > ---- > void func(){ writefln("func"); } > > void main(){ > void delegate() dg; > dg = toDelegate(&func); > dg(); // np > //writefln(dg.ptr," ", dg.funcptr,"."); // Error: Stack Overflow @ > second dg call //writefln(); // Error: Access Violation @ second dg > call dg(); > } > ----
My tangofied of this code works, maybe it's a lib bug? On the other hand, is the delegate allocated on the stack? Anyway, here is another way: R delegate(T) toDg(R, T...)(R function(T) fp) { struct dg { R opCall(T t) { return (cast(R function(T)) this) (t); } } R delegate(T) t; t.ptr = fp; t.funcptr = &dg.opCall; return t; }