Template mixins and struct constructors

Daniel Kozak via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Mar 2 08:01:50 PST 2016


On Wednesday, 2 March 2016 at 14:50:15 UTC, Adrian Matoga wrote:
> On Wednesday, 2 March 2016 at 14:36:59 UTC, Daniel Kozak wrote:
>> OK maybe this one:
>>
>> template AddField(T) {
>>     T b;
>>     this(Args...)(T b, auto ref Args args)
>>     {
>>            this.b = b;
>>        this(args);
>>     }
>>     this(int a) {
>>         this.a = a;
>>     }
>> }
>>
>> struct Bar {
>>     int a;
>>     mixin AddField!(string);
>> }
>>
>> unittest {
>>     auto bar1 = Bar(5);
>>     auto bar2 = Bar("bar", 15);
>> }
>
> Then it's limited to structs in which only "int a" is to be 
> initialized. Not very useful and the templated ctor is not 
> needed now.
>
> struct Baz {
>     mixin AddField!string; // fail, no "int a" in Baz.
>     ulong d;
>     double x;
>     string foo;
> }

OK then:

mixin template AddField(T) {
     T b;
     auto ref constructor(Args...)(T b, auto ref Args args)
     {
         typeof(this) r;
         r.b = b;
         r.__ctor(args);
         return r;
     }
}

struct Bar {
     mixin AddField!string;
     int a;
     this(int a) { this.a = a; }
     alias __ctor = constructor;
}

unittest {
     import std.stdio;

     auto bar1 = Bar(5);
     auto bar2 = Bar("bar", 15);
     writeln(bar1);
     writeln(bar2);
}


More information about the Digitalmars-d-learn mailing list