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