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