struct ihatecompilers(T,size_t n){ struct hate{ T payload; alias payload this; float depthofhatred=float.max; } hate data; void opAssign(T a){ data=a; import std.stdio; data.writeln; assert(data==a); } } unittest{ struct inner{int a;} struct outer{ inner payload;alias payload this; string metadata; } ihatecompilers!(outer,100) foo; inner bar= inner(10); foo=outer(bar,"very very very important data"); } foo is assigned as outer(inner(10),""), droping the very very important data
void opAssign(T a) { data = a; // hate = outer; Needs implicit conversion. // outer converts to inner. // hate = inner; Needs implicit conversion. // No implicit conversion found. Lookup through hate's alias this. // getAliasThis(hate) -> outer. // outer = inner; Needs implicit conversion. // No implicit conversion found. Lookup through outer's alias this. // getAliasThis(outer) -> inner. // inner = inner; assert(data == a); // makes incorrect assumption } You need to define opAssign(T) for hate.