On Friday, 25 July 2014 at 15:48:54 UTC, John Colvin wrote:
On Friday, 25 July 2014 at 15:25:43 UTC, BlackEdder wrote:
Is it possible to automatically convert an associative array
to a
struct?
Basically I want to do the following (for any struct).
struct A {
double x = 1;
}
double[string] aa = ["x":1];
auto a = toStruct!A( aa );
I've been trying to do this at compile time, but can't work out
how setMembers and or loop over the associative array at
compile
time.
Is this possible at all?
one possible way:
enum aa = ["x": 1];
import std.traits;
struct AAtoStruct(alias aa)
if(isAssociativeArray!(typeof(aa)) &&
isSomeString!(KeyType!(typeof(aa))))
{
alias T = ValueType!(typeof(aa));
import std.range, std.algorithm, std.array;
mixin(zip(aa.keys, aa.values)
.map!`"T " ~ a[0] ~ " = " ~ a[1].to!string ~ ";\n"`
.joiner.array);
}
alias S = AAtoStruct!aa;
The associative array is actually not known at compile time. I
got it working though:
unittest {
T toStruct( T )( double[string] aa ) {
T t;
foreach (name; __traits(allMembers, T))
{
static if(
__traits(compiles, __traits(getMember, t, name))
// Skip Functions
&& !isSomeFunction!(__traits(getMember, t, name) )
)
{
mixin( "t." ~ name ~ "= aa[\"" ~ name ~ "\"];" );
}
}
return t;
}
struct A {
double x = -1;
}
double[string] aa = ["x":1];
auto a = toStruct!A( aa );
assert( a.x == 1 );
}