Hello! I've got an issue related to making a Tuple or AliasSeq using income template arguments. I want to create template makes an array of objects from array of arrays have different sizes and different types of values.

I created temporary solution. It is a concatenation of strings that will be passed to mixin.

But I just want to reorder parameters and pass them to ObjectType using AliasSeq or Tuple. Does it possible?

import std.stdio;

template objectFactory(ObjectType, Args...)
{
        static string loopGen() {
                string code = (ObjectType[]).stringof ~ " res = []; ";
                foreach(i, _; Args)
                {
                        enum level = to!string(i);
                        code ~= "foreach(elem" ~ level ~ "; Args[" ~ level ~ 
"])";
                }

                code ~= "res ~= " ~ ObjectType.stringof ~ "(";

                foreach(i, _; Args)
                {
                        enum level = to!string(i);
                        code ~= "elem" ~ level;

                        static if(i + 1 < Args.length)
                        {
                                code ~= ", ";
                        }
                }
                code ~= ");";

                return code;
        }

        static ObjectType[] factory()
        in {
                static assert(Args.length > 0);
                foreach(argumentCases; Args)
                        static assert(argumentCases.length > 0);
        }
        body
        {
                enum codeString = loopGen();
                mixin(codeString);
                return res;
        }

        alias objectFactory = factory;
}

Example:

struct Pair {
        int number;
        string name;
}

auto pairKit = objectFactory!(Pair, [1], ["qwe", "asd"]);
auto pairSet = pairKit();
assert(pairSet.length == 2);
writeln(pairSet[0]); // writes Pair(1, "qwe");
writeln(pairSet[1]); // writes Pair(1, "asd");

Thanks. Sorry if my english is not clear.

Reply via email to