On Monday, 28 May 2018 at 04:26:02 UTC, sarn wrote:
On Sunday, 27 May 2018 at 22:27:52 UTC, sarn wrote:
I've been thinking this through a bit, and here's what I've
got so far:
Here's a tweak that should be implementable without any
language changes:
Instead of trying to detect an empty destructor, we use a UDA
on the class --- call it BaseObject or something. A
BaseObject-marked class is meant to be something like Andre's
ProtoObject, or a custom alternative base. It must not define
a destructor or include members with destructors (could relax
this in future but works for now), and must only inherit from
other BaseObject-marked classes.
With that, __vdtor could be implemented using a template mixin.
For a BaseObject class, that would generate an empty virtual
__vdtor. For other classes, it would call __xdtor and then
(non-virtually) call __vdtor for the superclass as long as it's
not a BaseObject class.
Can anyone see something I've missed? I think it works with
the current type system, makes Andre's ProtoObject possible
while supporting subclassing with @nogc or whatever, and gives
us safe class destructors that could be compatible with C++.
How is __vdtor is going to be called, via destroy or via
directly? The issue that I see that your going to create a
"BaseObject" for every attribute or combination of said
attributes. Which creates way too much code bloat. Even more so
with the possibility of adding more attributes in the future.