On Thursday, 24 July 2014 at 04:53:41 UTC, Manu via Digitalmars-d
wrote:So that the type S!() is (easily) distinguishable from the
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 !() ??
template S.
Add !() at the instantiation site.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 !().
Phobos goes with helper functions: S!T s(T)(T t) {return S!T(t);}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.
I'm not a fan either.