how to do this meta-programming? print the address of random element's address of a variable length of arrays?
H. S. Teoh
hsteoh at quickfur.ath.cx
Sun Sep 13 04:30:33 UTC 2020
On Sat, Sep 12, 2020 at 07:31:57PM +0000, mw via Digitalmars-d-learn wrote:
[...]
> I've tried something like this: the AliasSeq specify the logical
> divide
>
> printRandomElemAddr(AliasSeq!(extraA, extraB, extraC, extraD), a, b, c);
>
> but cannot make it work.
Yes, because AliasSeq auto-expands, so `func(AliasSeq!(A,B,C),
AliasSeq!(D,E,F))` is equivalent to `func(A,B,C,D,E,F)`.
> (I'm asking for a more general solution, e.g. what if we have 3, or N
> sets of variadic parameters?)
>
> Looks like we can only pass 1 variadic parameters, then the question
> is what's the best way to divide it?
>
> Is there any special marker (variable or type?) can be used to divide?
> and what's the staticSplit?
Maybe the nested templates hack could be used? It depends on what
exactly you're trying to do though:
template myFunc(Args1...) {
template myFunc(Args2...) {
auto myFunc(/* runtime params here */) {
// you can use Args1.length and
// Args2.length here.
...
}
}
}
myFunc!(A,B,C)!(D,E,F)(/* runtime args here */);
Alternatively, define a non-eponymous version of AliasSeq that will
allow you to pass multiple lists of compile-time parameters without
auto-expanding and coalescing them:
template WrappedSeq(T...) {
// N.B.: not eponymous
alias members = T;
}
auto myFunc(Args1, Args2)(/*runtime params*/) {
alias list1 = Args1.members; // need manual unwrap
alias list2 = Args2.members;
}
// (Yeah the caller side will look ugly. C'est la vie.)
myFunc!(WrappedSeq!(A,B,C), WrappedSeq!(D,E,F))(/*runtime args*/);
T
--
Why can't you just be a nonconformist like everyone else? -- YHL
More information about the Digitalmars-d-learn
mailing list