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.
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.
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.