Template for function or delegate (nothing else)

useo useo at start.bg
Wed Feb 9 13:41:25 PST 2011


== 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();
}


More information about the Digitalmars-d-learn mailing list