On Wednesday, 2 March 2016 at 12:27:04 UTC, Adrian Matoga wrote:
I can do this:

struct Foo {
        int a;
        string b;
        this(int a) { this.a = a; }
this(Args...)(string b, auto ref Args args) { this.b = b; this(args); }
}

unittest {
        auto foo1 = Foo(5);
        auto foo2 = Foo("foo", 15);
}

However, the following code is invalid:

mixin template AddField(T) {
        T b;
        this(Args...)(T 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
}

sctor.d(31): Error: constructor sctor.Bar.this (int a) is not callable using argument types (string, int)

Is it by design or is it a bug?
And, if it is by design, what is the reason for that?

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
}

Reply via email to