Template mixins and struct constructors

Daniel Kozak via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Mar 2 06:36:59 PST 2016


On Wednesday, 2 March 2016 at 13:18:23 UTC, Adrian Matoga wrote:
> On Wednesday, 2 March 2016 at 12:48:47 UTC, Daniel Kozak wrote:
>> On Wednesday, 2 March 2016 at 12:27:04 UTC, Adrian Matoga 
>> wrote:
>>> (...)
>>
>> You can use string mixins:
>>
>> template AddField(T) {
>>         enum AddField = T.stringof ~ `  b;
>>         this(Args...)(` ~ T.stringof ~ ` b, auto ref Args args)
>>         {
>>                 this.b = b;
>>                 this(args);
>>         }`;
>> }
>>
>> struct Bar {
>>         mixin(AddField!string);
>>         int a;
>>         this(int a) { this.a = a; }
>> }
>>
>> unittest {
>>         auto bar1 = Bar(5);
>>         auto bar2 = Bar("bar", 15);  // line 31
>> }
>
> What if T is private type in some other module or, even worse, 
> a Voldemort type?

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);
}


More information about the Digitalmars-d-learn mailing list