On Friday, 21 October 2022 at 15:13:44 UTC, Ola Fosheim Grøstad wrote:
>On Friday, 21 October 2022 at 13:53:28 UTC, Guillaume Piolat wrote:
>But building and agreeing on abstractions is what define the ecosystem.
One big weakness in C++ and D is that generic definitions cannot be checked without instantiation.
There aren’t many languages that have both, templates and generics; C++/CLI and C++/CX are the only ones I know and I happen to have some experience with them. (In this nomenclature: template = independent copy of the implementation for every distinct instantiation, cf. C++ or D templates, especially class templates with mutable static variables; generic = one implementation, cf. Java or C#, and static variables cannot depend on the argument types.)
D could introduce generics and it would actually profit more from them than e.g. C++ would because D has first-class reference types and almost no user-defined implicit conversions. Templates are not really a replacement for generics. As an example where generics (would) shine and templates fall flat, consider range interfaces. We have (among others) InputRange
and BidirectionalRange
. A function taking an InputRange!Base
parameter should allow for an argument of type BidirectionalRange!Derived
(with Derived
and Base
classes or interfaces). In D, that is not possible because we cannot express the variance of a type parameter; templates are inherently antithetical to that.
Imagine how much more attractive D would be to OO crowd if it had first-class value type boxing, generics with variance and wildcards, and all the other OO stuff modern OO-fist languages offer. Using Java and C#, it feels like D only has the bare minimum to call itself object-oriented. There was some talk (by Átila, IIRC) that having first-class classes and OO in D was a design error. I have no idea whether there is actually a plan to fade those out improve them to be competitive on that front.