Christian Kamm wrote:
With the features of D2 you can get pretty close to implementing scope
classes as a template struct:

private final class PlacementNewClass(T) : T
{
  // forward constructors here!

  new(uint size, byte[__traits(classInstanceSize, PlacementNewClass)] mem) {
    return &mem;
  }
  delete(void* addr) {}
}

struct StackClass(T)
{
  // forward constructors here!
void construct() { new(memory) PlacementNewClass!(T);
  }

  ~this() {
    T tmp = cast(T)this;
    delete tmp;
  }

  // should be opImplicitCast
  T opCast() { return cast(T)cast(void*)&memory; }
  T opDot() { return cast(T)cast(void*)&memory; }

  byte[__traits(classInstanceSize, PlacementNewClass!(T))] memory;
}

Instances of StackClass!(C) behave pretty much like scope C, except they are
not limited to function local variables.

Unless there's a major difference to 'scope' I missed, I think that with the
addition of a few generic features it should be possible to move it into a
library entirely. In particular, D would need opImplicitCast as well as a
way of accessing and forwarding constructors to make this work nicely.

Yes this would be possible. But what's the advantage of doing it this way and is it worth sacrificing syntax sugar and backwards compatibility for? And would this even work right with RAII?

Reply via email to