AliasSeq of AliasSeq, or meta-functions that take multiple lists
H. S. Teoh via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Jun 19 14:11:56 PDT 2017
On Mon, Jun 19, 2017 at 01:59:33PM -0700, Ali Çehreli via Digitalmars-d-learn wrote:
> On 06/19/2017 12:54 PM, Jean-Louis Leroy wrote:
> > I need to process two sequences in parallel (select some elements of
> > sequence A depending of the corresponding element of sequence B).
> > How can I pass two sequences to a meta-function? I tried nesting
> > AliasSeqs but I get Perl4 style flattening:
> >
> > AliasSeq!(AliasSeq!(int, float),
> > AliasSeq!(char, double))
> > -> (int,float,char,double)
> >
> > I worked around the problem by passing a single AliasSeq to my
> > meta-function and using indexation to access the two sub-lists but
> > now I need to process three sequences in parallel and I am looking
> > for a cleaner solution.
> >
> >
>
> Hi Jean-Louis! :)
>
> One option is to nest templates:
>
> template foo(Args1...) {
> void bar(Args2...)() {
> }
> }
>
> void main() {
> foo!(int, float).bar!(char, double)();
> }
[...]
Another option is to encapsulate a sequence inside a non-eponymous
template so that it doesn't auto-expand:
template MySeq(T...)
{
alias elements = T;
}
template MyTemplate(T, U)
if (is(T : MySeq!(V...), V) &&
is(U : MySeq!(V...), V))
{
// do stuff with T.elements and U.elements
}
MyTemplate!(MySeq!(int, float), MySeq!(char, double));
The sig constraint in MyTemplate is not strictly necessary; it's just
additional insurance against passing the wrong thing to MyTemplate and
causing inscrutable template errors.
T
--
Without outlines, life would be pointless.
More information about the Digitalmars-d-learn
mailing list