June 12, 2010
Is there a good way to forward constructor arguments to a superclass constructor? I.e., if I have something like this

class Foo {
  int _x;

  this (int x) { _x = x; }
}

class Bar : Foo {}

I'd like to able to have this just work:

auto bar = new Bar(3);

However, doing this means that DMD complains that Bar.this isn't callable with an int argument. The next thing I tried was

class Bar : Foo
{
  this (Args) (Args... args) { super(args): }
}

at which point DMD complains that constructor Bar.this conflicts with template Bar.__ctor(Args...). I'm using DMD 2.046, if it matters.

Thank you,
Pillsy
June 14, 2010
pillsy:
> Is there a good way to forward constructor arguments to a superclass constructor?

This seems to work for simple situations, but maybe it doesn't work in more complex cases:


import std.traits: ParameterTypeTuple;

mixin template This() {
    this(ParameterTypeTuple!(super.__ctor) args) { super(args); }
}

class Foo {
    int _x;
    float _f;

    this(int x, float f) {
        this._x = x;
        this._f = f;
    }
}

class Bar : Foo {
    mixin This;
}

void main() {
    auto b = new Bar(10, 1.5);
}

Bye,
bearophile