Templates for instantiating derived class
rjkilpatrick
nothanks at example.com
Mon Sep 20 22:16:47 UTC 2021
Essentially, I would like to write a template that calls the
constructor of the parent class or the constructor of the
inherited class, depending on its type.
```d
#!/usr/bin/env dub
/+ dub.sdl:
name "mwe"
+/
class Super {
private int _a;
this(){}
this(int a) {
_a = a;
}
auto opBinary(string op)(int rhs) const if (op == "+") {
return new Super(_a + rhs); // Creates of type Super even
when called from derived class
}
}
class Derived : Super {
this(){}
this(int a) {
_a = a + 1;
}
}
void main() {
import std : writeln;
Super foo = new Super(1);
Super foo2 = foo + 1; // Works fine as calls `Super`
constructor
Derived bar = new Derived(2);
Derived bar2 = bar + 1; // Cannot implicitly cast `Super` to
`Derived`
}
```
Some kind of `return new this(...)` would be good, but that's not
possible.
I think it has to be done with templates, but I'm not sure how to
do this.
Any help would be greatly appreciated.
More information about the Digitalmars-d-learn
mailing list