Mutiple AliasSeq as input to template
David Sanders via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Wed Jun 7 12:03:39 PDT 2017
On Thursday, 25 May 2017 at 17:56:12 UTC, jmh530 wrote:
> On Thursday, 25 May 2017 at 16:36:45 UTC, jmh530 wrote:
>> [snip]
>
> I haven't played around with it fully, but it seems like the
> following resolves my issue in a sort of manual way:
>
> template Process1(A, B)
> {
> static if (!isIndex!B)
> alias Process1 = A;
> else
> alias Process1 = B;
> }
>
> template Process(size_t n, A...)
> if (n > 0)
> {
> import std.meta : AliasSeq;
>
> alias B = A[0..n];
> alias C = A[n..$];
>
> static if (n == 1)
> {
> alias Process = AliasSeq!(Process1!(B[0], C[0]));
> }
> else static if (n > 1)
> {
> alias Process = AliasSeq!(Process1!(B[0], C[0]),
> Process!(n - 1, B[1..$], C[1..$]));
> }
> }
You can use nested templates to process multiple AliasSeqs like
so:
enum isIndex(I) = is(I : size_t);
template Process(A...)
{
template With(B...)
{
import std.meta : AliasSeq;
static if (A.length == 0 || B.length == 0)
alias With = AliasSeq!();
else
{
static if(!isIndex!(B[0]))
alias Process1 = A[0];
else
alias Process1 = B[0];
alias With = AliasSeq!(Process1,
Process!(A[1..$]).With!(B[1..$]));
}
}
}
void main()
{
import std.meta : AliasSeq;
alias T = AliasSeq!(int[], int[]);
alias U = AliasSeq!(int, string);
static assert(is(Process!(T).With!(U) == AliasSeq!(int,
int[])));
}
More information about the Digitalmars-d-learn
mailing list