scope as template struct

Robert Fraser fraserofthenight at gmail.com
Tue Jan 13 18:09:18 PST 2009


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?



More information about the Digitalmars-d mailing list