Implicit instantiation of parameterless templates

F i L witte2008 at gmail.com
Fri Oct 5 12:25:47 PDT 2012


On Friday, 5 October 2012 at 12:01:30 UTC, Piotr Szturmaj wrote:
> Java and C# with their generics can do the following:
>
> class List { }
> class List<T> { }
>
> List list = new List();
> List<int> intList = new List<int>();
>
> In D similar code can't work because we can't have both a type 
> and a template with the same name. So this code must be 
> rewritten to:
>
> class List(T = Variant) { }
>
> List!() list = new List!();
> List!int intList = new List!int;
>
> When template name is used as a type and it can be instantiated 
> with no parameters it could be automatically rewritten to 
> List!() by the compiler. That code would then look like this:
>
> List list = new List;
> List!int intList = new List!int;
>
> The question is... is it possible to change D's behaviour to 
> avoid awkward !() template parameters _without_ breaking 
> backward compatibility?

+1 This is natural.

Plus, this has other uses I've mentioned on here in the past, 
"sub-scoping":

     class Foo
     {
         int bar;

         template baz
         {
             int bar;
         }
     }

     void main()
     {
         auto f = new Foo();

         f.bar = 0;
         f.baz.bar = 1;
     }

Currently, this syntax is possible, but requires to some ugly 
work-arounds.


More information about the Digitalmars-d mailing list