On Wednesday, 7 October 2015 at 11:27:49 UTC, Marc Schütz wrote:
On Wednesday, 7 October 2015 at 10:03:44 UTC, Namespace wrote:
Because there is no guarantee that others, who use your code, get it right and use those constructs.

The obvious way would be to make the constructor private and only provide a factory method returning a Scoped!Texture2D. I just tried that, but ran into problems with the construction (probably a bug in emplace). Don't have time to investigate this now. Maybe you can also return a Unique!Texture2D, but that one doesn't have an alias this...

Something like this?

----
import std.stdio;

struct Scoped(T) if (is(T == class)) {
    private void[__traits(classInstanceSize, T)] _buf = void;

    this(Args...)(auto ref Args args) {
        _buf = typeid(T).init[];
        this.get().__ctor(args);
    }

    @disable
    this(this);

    ~this() {
        .destroy(this.get());
    }

    @nogc
    private inout(T) get() inout pure nothrow {
        return cast(T) _buf.ptr;
    }

    auto opDispatch(string method, Args...)(auto ref Args args) {
        return mixin("this.get()." ~ method ~ "(args)");
    }
}

class A {
    private string name;

    private this(string name) {
       this.name = name;
       writeln("Creating A");
    }
        
        static auto scoped(Args...)(auto ref Args args) {
                return Scoped!(typeof(this))(args);
        }

    ~this() {
       writeln("Destroying A");
    }

    void hello() {
       writeln("Hello, ", this.name);
    }
}

void main() {
        auto a = A.scoped("Foo");
        a.hello();
}
----

Kinda ugly, but it works.

Reply via email to