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.