Associative array to Struct at compile time
BlackEdder via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Jul 25 09:01:28 PDT 2014
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 );
}
More information about the Digitalmars-d-learn
mailing list