Why can't templates with default arguments be instantiated without the bang syntax?

Simen Kjaeraas simen.kjaras at gmail.com
Thu Sep 15 08:02:41 PDT 2011


On Thu, 15 Sep 2011 16:46:24 +0200, Andrej Mitrovic  
<andrej.mitrovich at gmail.com> wrote:

> struct Foo(T = int) {}
>
> void main()
> {
>     Foo foo;  // fail
>     Foo!() bar;  // ok
> }
>
> It would be very convenient to be able to default to one type like this.
>
> For example, in CairoD there's a Point structure which takes doubles
> as its storage type, and then there's PointInt that takes ints. The
> reason they're not both a template Point() that takes a type argument
> is because in most cases the user will use the Point structure with
> doubles, and only in rare cases Point with ints. So to simplify code
> one doesn't have to write Point!double in all of their code, but
> simply Point.
>
> If the bang syntax wasn't required in presence of default arguments
> then these workarounds wouldn't be needed.

How would you then pass a single-argument template as a template alias
parameter?

Example:

template Foo( ) {
     template Bar( ) {
     }
}

template Baz(alias A) {
     mixin A!();
}

void main( ) {
     mixin Baz!Foo;
}

Does this mixin Foo or Bar to main's scope?

-- 
   Simen


More information about the Digitalmars-d-learn mailing list