On Monday, 22 August 2016 at 18:48:12 UTC, ag0aep6g wrote:
On 08/22/2016 08:04 PM, Engine Machine wrote:
How do you seriously think this is cleaner/simpler? You have
two
classes. Their is no uniformity between them. You have
uniformity
between all the derived classes then have a special case for
the base
class. A certain easy to follow pattern is set up but
needlessly break
it for one case. Why?
It avoids the relatively obscure (and badly named, by me)
InstantiateOrEmptySeq template.
You can take this further with template constraints. Gives it a
more uniform appearance at the price of some repetition:
----
class T()
{
int x;
}
class T(A...) : T!(A[0..$-1])
if (A.length > 0 && A[$-1] == "Animal")
{
int y;
}
class T(A...) : T!(A[0..$-1])
if (A.length > 0 && A[$-1] == "Dog")
{
int z;
}
class T(A...) : T!(A[0..$-1])
if (A.length > 0 && A[$-1] == "Pug")
{
int s;
}
----
I wouldn't say that this is obviously, objectively,
significantly better than the version with the helper template,
though.
Yeah, but a name means nothing. Change it if you want ;)
By the way, it's not obvious to me what this whole thing
achieves in practice. And whatever benefit there is, it has to
be weighed against the cost of the added complexity.
What it achieves is a uniform way to create a hierarchical
relationship without excessive verbosity. Now, the static ifs are
probably the most verbose part, a static switch would help:
static switch (A)
{
case "Animal":
return;
...
}
But only slightly.
I don't mean to say that this is not worth pursuing. Just a
friendly reminder that over-engineering is something to look
out for, from someone who is prone to over-engineering himself.
Ultimately it is just syntax, it does nothing over what D already
does. It doesn't create anything new. In some cases it
simplifies. If it does, then great, if it doesn't then don't use
it. While I would prefer a totally different syntax, I also like
to keep things organized. Having multiple classes floating around
for certain things is just not needed so there should be an
option.