The following code works better. Forgot to allow for multiple arguments. Runtime variables are not unrolled though but I'll work on understanding how you were able to unify the two as one(I think in your reduceImpl).

module main;

import std.stdio, std.traits;

template tuple(args...)
{
    alias tuple = args;
}

template tUnrollArgs(args...)
{
        static if (isArray!(typeof(args[0])))
        {
                pragma(msg, "isarray");
                static if (args.length > 1)
                {
                        pragma(msg, "unrolling");
                        alias tUnrollArgs = tuple!(tUnrollArgs!(args[0]), 
args[1..$]);
                }
                else
                {
                        static if (args[0].length > 1)
                        {
                                pragma(msg, "1");
alias tUnrollArgs = tuple!(args[0][0], tUnrollArgs!(args[0][1..$]));
                        }
                        else
                        {
                                pragma(msg, "2");
                                alias tUnrollArgs = tuple!(args[0][0]);
                        }
                }
        }
        else
                static if (args[0].length > 1)
alias tUnrollArgs = tuple!(args[0], tUnrollArgs!(args[0][1..$]));
                else
                        alias tUnrollArgs = args;
}

void main(string[] argv)
{
        auto z = ["1", "2"];
    writeln(tUnrollArgs!(["a", "b"], z, "c"));
        readln();
}


Reply via email to