D 2015/2016 Vision?
Gary Willoughby via Digitalmars-d
digitalmars-d at puremagic.com
Mon Oct 5 10:19:07 PDT 2015
On Sunday, 4 October 2015 at 22:10:18 UTC, Namespace wrote:
> You can use classes without GC _and_ with deteministic lifetime:
>
> ----
> import std.stdio;
>
> class A {
> string name;
>
> this(string name) {
> this.name = name;
> }
>
> void hello() {
> writeln("Hallo, ", this.name);
> }
> }
>
> struct Scoped(T) if (is(T == class)) {
> import core.stdc.stdlib : malloc, free;
>
> enum SIZE = __traits(classInstanceSize, T);
>
> T obj;
>
> this(Args...)(auto ref Args args) {
> void[] buffer = malloc(SIZE)[0 .. SIZE];
> buffer[] = typeid(T).init[];
>
> this.obj = cast(T) buffer.ptr;
> this.obj.__ctor(args);
> }
>
> ~this() {
> destroy(this.obj);
> free(cast(void*) this.obj);
> }
>
> alias obj this;
> }
>
> auto scoped(T, Args...)(auto ref Args args) if (is(T == class))
> {
> return Scoped!T(args);
> }
>
> void main() {
> auto a = scoped!A("Foo");
> a.hello();
> }
> ----
This can be shortened to:
import std.stdio;
import std.typecons;
class A
{
string name;
this(string name)
{
this.name = name;
}
void hello()
{
writeln("Hello, ", this.name);
}
}
void main()
{
auto a = scoped!A("Foo");
a.hello();
}
More information about the Digitalmars-d
mailing list