Post-ctor ctor
KennyTM~
kennytm at gmail.com
Mon Aug 8 14:31:24 PDT 2011
On Aug 9, 11 05:05, Andrej Mitrovic wrote:
> Done deal:
>
> import std.traits;
>
> string FieldInit(T, int len, string fun)()
> {
> string result;
> auto fields = [__traits(allMembers, T)];
>
> result ~= "this(";
>
> foreach (y, x; (RepresentationTypeTuple!T)[0..len])
> {
> result ~= x.stringof ~ " " ~ fields[y] ~ ", ";
> }
>
> result = result[0.. $-2] ~ ") { ";
>
> foreach (x; 0 .. len)
> {
> result ~= "this." ~ fields[x] ~ " = " ~ fields[x] ~ "; ";
> }
>
> result ~= fun ~ "();";
> result ~= "}";
>
> return result;
> }
>
> struct Foo
> {
> int a;
> int b;
> int c;
> int d;
>
> mixin( FieldInit!(typeof(this), 4, "_this") );
>
> int sum;
> int average;
>
> void _this()
> {
> sum = a + b + c + d;
> average = (a + b + c + d) / 4;
> }
> }
>
> void main()
> {
> auto foo = Foo(1, 2, 3, 4);
>
> assert(foo.sum == 10);
> assert(foo.average == 2);
> }
>
> Mostly.. Of course it doesn't work too good if the fields are placed
> below some functions.
Template-mixin is often shorter and less error-prone.
-----------------
mixin template FieldInit(size_t count, alias fun)
{
this(RepresentationTypeTuple!(typeof(this))[0..count] params)
{
foreach (y, x; __traits(allMembers, typeof(this))[0..count])
__traits(getMember, this, x) = params[y];
fun();
}
}
struct Foo
{
int a;
int b;
int c;
int d;
int sum;
int average;
void _this()
{
sum = a + b + c + d;
average = (a + b + c + d) / 4;
}
mixin FieldInit!(4, _this);
}
-----------------
More information about the Digitalmars-d
mailing list