On 24 July 2014 16:02, anonymous via Digitalmars-d <digitalmars-d@puremagic.com> wrote:
On Thursday, 24 July 2014 at 04:53:41 UTC, Manu via Digitalmars-d
wrote:

struct S(size_t len = 10)
{
  ubyte[len] data;
}

S!100 x; // this works fine
S y; // this doesn't work (!)
S!() z; // this works

The template arg has a default arg, why require !() ??

So that the type S!() is (easily) distinguishable from the
template S.

Hmm.


This causes problems in meta code, where you want to create an instance of
some T, and T may be a normal type with no template args, in which case !()
is invalid, but a template type with default args should also be
acceptable, but it doesn't work because the meta code doesn't specify !().

Add !() at the instantiation site.

Then the code is broken for any type that isn't a template... it's a mutually exclusive situation.


struct S(T)
{
  this(T t)
  {
    m = t;
  }

  T m;
}

int myThing;
auto s = S(myThing); // error!
auto s = S!(typeof(myThing))(myThing); // works, but horrible, and breaks
down again when used in place of non-template counterparts in meta code.

Phobos goes with helper functions: S!T s(T)(T t) {return S!T(t);}
I'm not a fan either.

Why? Surely this is easy to implement?