On Wed, 09 Feb 2011 16:41:25 -0500, useo <[email protected]> wrote:

== Auszug aus bearophile ([email protected])'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

Reply via email to