https://issues.dlang.org/show_bug.cgi?id=12851
--- Comment #1 from Kenji Hara <[email protected]> --- Please paste case code directly, or attach the source file. // From http://dpaste.dzfl.pl/ef876e8a6cc9 template toTypeTuple(alias range) { import std.range : isInputRange; import std.traits : isArray, isNarrowString; import std.typetuple: TypeTuple; alias Arr = typeof(range); static if (isArray!Arr && !isNarrowString!Arr) { static if (range.length == 0) { alias toTypeTuple = TypeTuple!(); } else static if (range.length == 1) { alias toTypeTuple = TypeTuple!(range[0]); } else { alias toTypeTuple = TypeTuple!(toTypeTuple!(range[0 .. $/2]), toTypeTuple!(range[$/2 .. $])); } } else static if (isInputRange!Arr) { import std.array : array; alias toTypeTuple = toTypeTuple!(array(range)); } else { import std.string : format; static assert (0, format("Cannot transform %s of type %s into a TypeTuple.", range, Arr.stringof)); } } template staticZip(alias values, Indices...) { import std.typetuple; template Pair(T...) if (T.length == 2) { alias Pair = TypeTuple!(T); } static if (Indices.length == 1 && values.length == 1) { alias staticZip = TypeTuple!(Pair!(Indices[0], values[0])); } else { alias staticZip = TypeTuple!(Pair!(Indices[0], values[0]), staticZip!(Indices[1..$], values[1..$])); } } struct Index(int upperBound) if (upperBound > 0) { import std.range; enum range = toTypeTuple!(iota(upperBound)); enum length = range.length; alias rangeType = typeof(range[0]); alias rangeType this; } alias N = Index!5; void main() { import std.typetuple; const int[5] arr; pragma(msg, staticZip!(arr, N)); } --
