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

Christophe travert at phare.normalesup.org
Thu Sep 15 08:54:19 PDT 2011


"Simen Kjaeraas" , dans le message (digitalmars.D.learn:29539), a
 écrit :
> 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?

I don't get the problem. Maybe I am not used to mixin enough. Can you 
mixin normal templates, and not only mixin templates ?

Anyway, why would this mixin Bar ?
As I understand the proposition, only "mixin Baz!(Foo.Bar);" and of 
course "mixin Baz!(Foo!().Bar)" should mixin Bar.

-- 
Christophe


More information about the Digitalmars-d-learn mailing list