September 21, 2003 delegate with null this ? | ||||
---|---|---|---|---|
| ||||
Walker is there a way to do ... fp = &((cast(foo)null).bar); where fp is a delegate, foo a class with a member `bar` ? i.e. end up with a delegate to a member function that will pass null for this. |
September 21, 2003 Re: delegate with null this ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike Wynn | Mike Wynn wrote: > > Walker is there a way to do ... > fp = &((cast(foo)null).bar); > where fp is a delegate, foo a class with a member `bar` ? > > i.e. end up with a delegate to a member function that will pass null for this. As far as I remember, a delegate with this=null will crash (DMD 0.64?). But you can add a dummy this to a function or method pointer. Better be sure it will never use the dummy this. All I know about delegates is in this module: /* ** dg.d ** Copyright (C) 2003 Helmut Leitner ** Donated to Digital Mars. ** Released under the GNU GPL, see LICENSE.TXT ** and http://www.gnu.org/copyleft/gpl.html */ module venus.dg; import venus.all; alias void delegate () void_dg_void; alias void delegate (...) void_dg_ellipsis; alias void (*void_fp_void) (); alias void (*void_fp_this) (void *); alias void (*void_fp_ellipsis) (...); struct DelegateStruct { void *pthis; void (*method)(void *pthis); } class DelegateHacker { static DelegateHacker dh; static void *pthis; void method() { } void set_pthis() { pthis=this; } static this() { dh=new DelegateHacker; dh.set_pthis(); } static void_dg_void FpRetDelegate(void_fp_void fp) { void_dg_void dg; ((DelegateStruct *)&dg).pthis=pthis; ((DelegateStruct *)&dg).method=(void_fp_this)fp; return dg; } } void_dg_void FpRetDelegate(void_fp_void fp) { return DelegateHacker.FpRetDelegate(fp); } void_dg_ellipsis FpRetDelegate(void_fp_ellipsis fp) { return (void_dg_ellipsis) DelegateHacker.FpRetDelegate((void_fp_void)fp); } -- Helmut Leitner leitner@hls.via.at Graz, Austria www.hls-software.com |
Copyright © 1999-2021 by the D Language Foundation