Templates - What's Up with the template keyword?

Mike Parker aldacron at gmail.com
Tue Apr 9 14:25:18 UTC 2019


On Tuesday, 9 April 2019 at 10:53:49 UTC, Ron Tarrant wrote:
> On Monday, 8 April 2019 at 14:56:46 UTC, Mike Parker wrote:
>
>> In the subsequent sections, I show both long and short 
>> (eponymous) forms of enum and function templates.
>
> In your book, Mike, you stated:
>
>> Remember, a template is only instantiated once for each set of 
>> arguments and
>> the same instantiation can be repeated in multiple modules 
>> throughout a
>> program. If each instantiation were scoped locally, the 
>> template would no
>> longer work as expected.
>
> That leads me to speculate that it should be possible to use a 
> class template as a sort of singleton. But, because a class 
> template (from what I understand currently) needs to be 
> instantiated using 'new,' I'm thinking maybe it isn't possible.
>
> Can you (or someone else) clear this up for me, please?

Instantiating a class template is not like instantiating a single 
instance of an object. What it does is create an implementation 
of the class, not an instance. So given this:

class Foo(T) {
    T item;
}

Then this instantiation (which, byt the way, does not need new -- 
an alias will do the trick):

alias IntFoo = Foo!int;

Essentially does this:

class FooWithInt {
     int item;
}

Of course, the symbol will be different than 'FooWithInt', but 
the point is for every T there has to be a uniquely named 
implementation of Foo.

>
> What I have in mind is a template wrapped around a GTK 
> AccelGroup that could then be instantiated in the MainWindow as 
> well as inside any MenuItem needing a keyboard shortcut 
> assignment.

Off the top of my head, to get a Singleton template, you could 
implement all of your singleton plumbing (thread safety if you 
need it, etc) in the template and add a `static _instance` member 
just as you would for any non-templated singleton:

class Singleton(T) {
     private static Singleton!T _instance;
     static Singleton!T instance() {
         if(_instance is null) {
             _instance = new Singleton!T;
         }
         ...
     }

     private T _thing;
     ...
}

And you can then instantiate directly or, more conveniently, use 
an alias:

alias Accelerators = Singleton!AccelGroup;

Then:

Accelerators.instance.doSomething();







More information about the Digitalmars-d-learn mailing list