Dynamic templated virtuals - I still often want them

Adam D. Ruppe destructionator at gmail.com
Thu Jul 23 02:38:27 UTC 2020


You might know about D's template this parameters, which adapt to 
the static type of a `this` reference on a call, or with the 
curiously recurring template pattern, which passes a derived 
class to the base class so the base class can inspect the derived 
class.

Both of these are useful at times, but neither quite do what I 
have in mind here.

Imagine this:

---
class Base {
      virtual string serialize(this This)() {
            return This.stringof; // just for example
      }
}

class Derived : Base {

}

void main() {
     Base b = new Derived();
     assert(b.serialize() == "Derived");
}
---

That does NOT work today. For one, of course, D has no `virtual` 
keyword, but if you left that out, it would compile, but fail the 
assert because the static type of `b` passed to the template This 
is actually still `Base`.

But imagine if `serialize` actually got a virtual table entry, 
just like if it wasn't a template at all, but each child class 
automatically got an instance of it made for itself.

So it would be as if I wrote

class Base {
      string serialize() {
            return Base.stringof;
      }
}

class Derived : Base {
      override string serialize() {
            return Derived.stringof;
      }
}

by hand. Of course, it is possible to do this kind of thing with 
mixin templates or the CRTP, but in both cases, the Derived class 
must actually write it in the child class, and if you don't 
there's no way to really tell; it will still compile and just use 
the base class implementation. Which might be OK but it isn't 
perfect.

It would just be cool if the base class template was 
automatically instantiated again for the child class, while still 
working like a normal virtual call.


More information about the Digitalmars-d mailing list