On Thu, Jan 21, 2016 at 10:24:55PM +0000, Nordlöw via Digitalmars-d-learn wrote: [...] > I'm currently only lacking one thing ...namely a way to group the > parameters of the call to a variadic function based on their offset > and stride. That is if have > > haystack.substitute(x0, y0, > x1, y1, > x2, y2, ...); > > How do I extract x0,x1,x2 into a one parameter tuple and y0,y1,y2 into > another?
Try this: import std.meta; template Stride(size_t stride, size_t offset, Args...) if (stride > 0) { static if (offset >= Args.length) alias Stride = AliasSeq!(); else static if (stride >= Args.length) alias Stride = AliasSeq!(Args[offset]); else alias Stride = AliasSeq!(Args[offset], Stride!(stride, offset, Args[stride .. $])); } alias MyList = AliasSeq!("a", "b", "c", "d", "e", "f", "g", "h", "i"); pragma(msg, Stride!(1, 0, MyList)); pragma(msg, Stride!(2, 0, MyList)); pragma(msg, Stride!(2, 1, MyList)); pragma(msg, Stride!(3, 0, MyList)); pragma(msg, Stride!(3, 1, MyList)); pragma(msg, Stride!(3, 2, MyList)); Compiler output: tuple("a", "b", "c", "d", "e", "f", "g", "h", "i") tuple("a", "c", "e", "g", "i") tuple("b", "d", "f", "h") tuple("a", "d", "g") tuple("b", "e", "h") tuple("c", "f", "i") T -- This sentence is false.