xxxxxxxxxx
import std.experimental.all;
alias Map(Key) = Variant[Key];
auto var(T)(auto ref T value) {
return Variant(value);
}
auto as(T)(auto ref Variant var) {
if (!var.convertsTo!T) {
return T.init;
}
return var.get!T;
}
void mapSelf(alias self, alias aa)() {
alias T = typeof(self);
static foreach (i; 0 .. T.tupleof.length) {{
enum k = T.tupleof[i].stringof;
alias M = typeof(mixin("T." ~ k));
mixin(`self.` ~k~ ` = aa["`~k~`"].as!M;`);
}}
}
struct S {
int a;
int b;
this(Map!string map) {
mapSelf!(this, map);
}
}
void main() {
Map!string m = ["a": 2.var, "b": 3.var];
auto a = S(m);
writeln(a);
}