...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

わたし「まだあなたのことよくわかってないの・・・ごめんなさい」shared_ptr「・・・」

import std.stdio;

struct shared_ptr(T) if (is(T == class))
{
	uint n;
	
	T p;
	alias p this;
	
	this(T p)
	{
		n++;
		this.p = p;
		
		writeln("construct, ", n);
	}
	
	this(this)
	{
		n++;
		writeln("reference copy, ", n);
	}
	
	~this()
	{
		n--;
		if (n==0)
		{
			delete p;
			writeln("delete");
		}
		else
			writeln("destruct, ", n);
	}
}

class A
{
	void f(){writeln("hoge");}
}

void g(shared_ptr!A p)
{
	p.f();
}

void main()
{
	writeln("[1");
	{
		writeln("[2");
		auto x = shared_ptr!A(new A);
		{
			writeln("[3");
			auto y = x;
			{
				writeln("[4");
				g(y);
				writeln("]4");
			}
			writeln("]3");
		}
		g(x);
		writeln("]2");
	}
	writeln("]1");
}
[1
[2
construct, 1
[3
reference copy, 2
[4
reference copy, 3
hoge
destruct, 2
]4
]3
destruct, 1
reference copy, 2
hoge
destruct, 1
]2
delete
]1

うーん? こういうことか?
C++の奴は仮想関数の呼び出しとかでもごもごしてた気がする.