On Saturday, 24 February 2018 at 06:14:52 UTC, deadalnix wrote:
On Thursday, 22 February 2018 at 19:26:54 UTC, Andrei
Alexandrescu wrote:
After coding https://github.com/dlang/phobos/pull/6192 with
AliasSeq, the experience has been quite pleasurable. However,
in places the AliasSeq tends to expand too eagerly, leading to
a need to "keep it together" e.g. when you need to pass two of
those to a template.
I worked around the issue by nesting templates like this:
template Merge(T...)
{
template With(U...)
{
static if (T.length == 0)
alias With = U;
else static if (U.length == 0)
alias With = T;
else static if (T[0] < U[0]
|| T[0] == U[0] && T[1].stringof <=
U[1].stringof)
alias With =
AliasSeq!(T[0], T[1], Merge!(T[2 ..
$]).With!U);
else
alias With =
AliasSeq!(U[0], U[1], Merge!T.With!(U[2 ..
$]));
}
}
So instead of the unworkable Merge!(AliasSeq!(...),
AliasSeq!(...)), one would write
Merge!(AliasSeq!(...)).With!(AliasSeq!(...)).
The problem remains for other use cases, so I was thinking of
adding to std.meta this simple artifact:
template PackedAliasSeq!(T...)
{
alias expand = AliasSeq!T;
}
That way, everything stays together and can be expanded on
demand.
Andrei
Isn't a packed AliasSeq just a tuple ?
It is not a tuple (in the `std.typecons.Tuple` sense) if it can
contain values, types and other kinds of symbols. I think a more
appropriate name would be AliasTuple - an AliasSeq that doesn't
auto-expand.