[Issue 21891] Cannot alias every kind that can be passed via variadic templates
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Tue May 4 19:43:57 UTC 2021
https://issues.dlang.org/show_bug.cgi?id=21891
--- Comment #4 from Andrei Alexandrescu <andrei at erdani.com> ---
(In reply to Paul Backus from comment #2)
> (In reply to Andrei Alexandrescu from comment #0)
> > So in fact 1 is bindable to an alias but somehow not in all contexts!
>
> Specifically: an expression can bind to a template alias parameter, but is
> not allowed on the right-hand side of an alias declaration.
>
> The reason `alias Y = X;` works but `alias Y = X[0];` doesn't is that `X` by
> itself on the right-hand side is parsed as a symbol, not an expression. The
> variadic parameter is a distraction.
Hm... how does this fit then? Just found it in core.internal.traits:
template maxAlignment(U...)
{
static if (U.length == 0)
static assert(0);
else static if (U.length == 1)
enum maxAlignment = U[0].alignof;
else static if (U.length == 2)
enum maxAlignment = U[0].alignof > U[1].alignof ? U[0].alignof :
U[1].alignof;
else
{
enum a = maxAlignment!(U[0 .. ($+1)/2]);
enum b = maxAlignment!(U[($+1)/2 .. $]);
enum maxAlignment = a > b ? a : b;
}
}
template classInstanceAlignment(T)
if (is(T == class))
{
alias classInstanceAlignment = maxAlignment!(void*, typeof(T.tupleof));
}
Does that work because there's a template instantiation on the right-hand side?
--
More information about the Digitalmars-d-bugs
mailing list