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);
}