Template for function or delegate (nothing else)
Steven Schveighoffer
schveiguy at yahoo.com
Wed Feb 9 14:05:43 PST 2011
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
More information about the Digitalmars-d-learn
mailing list