D 2015/2016 Vision?
Namespace via Digitalmars-d
digitalmars-d at puremagic.com
Mon Oct 5 13:23:39 PDT 2015
On Monday, 5 October 2015 at 19:07:20 UTC, Meta wrote:
> On Monday, 5 October 2015 at 17:19:09 UTC, Gary Willoughby
> wrote:
>> 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();
>> }
>
> There's a critical flaw in `scoped`. Observe:
>
> import std.stdio;
> import std.typecons;
>
> class A
> {
> string name;
>
> this(string name)
> {
> this.name = name;
> writeln("Creating A");
> }
>
> ~this()
> {
> writeln("Destroying A");
> }
>
> void hello()
> {
> writeln("Hello, ", this.name);
> }
> }
>
> void main()
> {
> auto a1 = scoped!A("Foo");
> a1.hello();
>
> A a2 = scoped!A("Foo");
> a2.hello();
> }
>
>
> The output:
>
> Creating A
> Hello, Foo
> Creating A
> Destroying A
> Destroying A
> object.Error: Access Violation
----
import std.stdio;
struct Scoped(T) {
void[__traits(classInstanceSize, T)] buf = void;
this(Args...)(auto ref Args args) {
this.buf = typeid(T).init[];
(cast(T) this.buf.ptr).__ctor(args);
}
~this() {
.destroy(this.get());
}
T get() {
return cast(T) this.buf.ptr;
}
alias get this;
}
auto scoped(T, Args...)(auto ref Args args) {
return Scoped!T(args);
}
class A
{
string name;
this(string name)
{
this.name = name;
writeln("Creating A");
}
~this()
{
writeln("Destroying A");
}
void hello()
{
writeln("Hello, ", this.name);
}
}
void main() {
auto a1 = scoped!A("Foo");
a1.hello();
auto a2 = scoped!A("Bar");
a2.hello();
}
----
Application output:
Creating A
Hello, Foo
Creating A
Hello, Bar
Destroying A
Destroying A
More information about the Digitalmars-d
mailing list