September 21, 2003
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

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