Changing Template Static Ifs to Recursion

jmh530 via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed May 31 11:50:27 PDT 2017


I have a struct that I am using like a Tuple, but I want to be 
able to opIndex in a different way than Tuple's opIndex. I want 
to be able to opIndex whatever is underlying the Tuple.

The code below works, but is kind of annoying because to extend 
you have to keep adding static ifs. I want to change it to a 
recursion that can handle any length. I tried a few different 
options, but not having much luck.

Would appreciate any advice!

Note: I left out the function foo, but think of foo is to Foo as 
tuple is to Tuple.

import std.typecons : Tuple;

struct Foo(T...)
{
	alias U = Tuple!T;
	U underlying;
	alias underlying this;
	
	alias Names = U.fieldNames;
	alias Types = U.Types;
	
	template process(B...)
	{
		auto ref process(A...)(A a)
		{
			alias fooB = foo!(B);
			
			static if (A.length == 1)
			{
				return fooB(this.underlying[0][a[0]]);
			}
			else static if (A.length == 2)
			{
				return fooB(this.underlying[0][a[0]],
					    this.underlying[1][a[1]]);
			}
			else static if (A.length == 3)
			{
				return fooB(this.underlying[0][a[0]],
					    this.underlying[1][a[1]],
					    this.underlying[2][a[2]]);
			}
		}
	}
	
	auto ref opIndex(Slices...)(Slices slices)
		if (Slices.length == Types.length)
	{
		return process!(Names)(slices);
	}
}


More information about the Digitalmars-d-learn mailing list