Template for function or delegate (nothing else)

useo useo at start.bg
Wed Feb 9 14:29:50 PST 2011


== Auszug aus Steven Schveighoffer (schveiguy at yahoo.com)'s Artikel
> On Wed, 09 Feb 2011 16:41:25 -0500, useo <useo at start.bg> wrote:
> > == Auszug aus bearophile (bearophileHUGS at lycos.com)'s Artikel
> >> useo:
> >> > I just have a problem with my variables.
> >> >
> >> > For example... my class/template just looks like:
> >> >
> >> > class Example(T) if (is(T == delegate) || is(T ==
function))
> >> > {
> >> >    T callback;
> >> >
> >> >    void setCallback(T cb) {
> >> >       callback = cb;
> >> >    }
> >> >
> >> > }
> >> >
> >> > This means that I need variables like Example!(void
function
> > ())
> >> > myVariable. But is there any possibility to use variables
like
> >> > Example myVariable?
> >> D is not the SML language, templates are just placeholders.
If
> > you don't instantiate a template, you have only a symbol.
Example
> > is only assignable to an alias (and in past, to a typedef):
> >> alias Example Foo;
> >> > The template declaration only defines the type of
> >> > a callback and perhaps one method-declaration nothing
else. I
> > already
> >> > tried Example!(void*) because delegates and functions are
void
> >> > pointers but I always get an error. I hope there is any way
> > to do
> >> > this.
> >> I don't yet understand what you are trying to do.
> >> Other notes:
> >> - What if your T is a functor (a callable class/struct/union
> > instance that defined opCall)?
> >> - sizeof of a function pointer is 1 CPU word, while a
delegate
> > is 2 CPU words (and a delegate clojure has stuff on the heap
too,
> > sometimes).
> >> Bye,
> >> bearophile
> >
> > Idea is the following:
> >
> > class Example(T) if (is(T == delegate) || is(T == function)) {
> >
> >    T callback;
> >
> >    void setCallback(T cb) {
> >       callback = cb;
> >    }
> >
> >    void opCall() {
> >       callback();
> >    }
> >
> > }
> >
> > other file:
> >
> > import example;
> >
> > private {
> >
> >    Example variable;
> >
> > }
> >
> > void setExampleVariable(Example ex) {
> >    variable = ex;
> > }
> >
> > void callCurrentExampleVariable() {
> >    variable();
> > }
> I don't think you want templates.  What you want is a tagged
union (and a
> struct is MUCH better suited for this):
> // untested!
> struct Example
> {
>     private
>     {
>        bool isDelegate;
>        union
>        {
>           void function() fn;
>           void delegate() dg;
>        }
>     }
>     void setCallback(void function() f) { this.fn = f;
isDelegate = false;}
>     void setCallback(void delegate() d) { this.dg = d;
isDelegate = true;}
>     void opCall()
>     {
>        if(isDelegate)
>           dg();
>        else
>           fn();
>     }
> }
> -Steve

Looks really interesting and seems to work. Thanks in advance!


More information about the Digitalmars-d-learn mailing list