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