== Auszug aus Steven Schveighoffer ([email protected])'s Artikel > 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
Looks really interesting and seems to work. Thanks in advance!
