Is it possible to do such thing without using string mixin?

------------
import std.stdio;
import std.metastrings;

struct Key(T...)
{
        static string declareFields() // compile-time
        {
                string declaration;

                foreach (index, type; T)
                        declaration = declaration ~ Format!("%s field_%s;\n", 
type.stringof, index);

                return declaration;
        }

        mixin(declareFields());
        uint numFields;

        static string declareFieldsAssignment() // compile-time
        {
                string declaration;
                immutable(string) exceptionMessage = "Argument type mismatch.";

                foreach (index, type; T)
                {
                        declaration = declaration ~
                                Format!("if (_arguments[%s] != typeid(%s))\n", 
index, type.stringof) ~
                                        "        throw new Exception(\"" ~ 
exceptionMessage ~
"\");\n" ~
                                        "else\n" ~
                                        "{\n" ~
                                Format!("       field_%s = *(cast(%s*) 
_argptr);\n", index, type.stringof) ~
                                Format!("       _argptr += field_%s.sizeof;\n", 
index) ~
                                        "}\n\n";
                }

                return declaration;
        }

        void assignFields(...)
        {
                mixin(declareFieldsAssignment());
                numFields = _arguments.length;
        }
}

void main()
{
        Key!(string) testval;

        testval.assignFields("test string");
        writeln(testval);
}

Reply via email to