...ing logging 4.0

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

Logger

import std.stdio;

class Logger(T)
{
	T loggee;
	this()
	{
		loggee = new T;
	}
	this(T loggee)
	{
		this.loggee = loggee;
	}
	auto opDispatch(string name, U...)(U args)
	{
		writeln("call " ~ name);
		mixin("return loggee." ~ name ~ "(args);");
	}
}

class A
{
	void func(){writeln("fire");}
}

void main()
{
	auto x = new A; // ログなし
	x.func();

	auto y = new Logger!A; // ログあり
	y.func();
}

転送するだけでloggerが作れるな.

追記

あれ?
これってアスペクトの織り込みじゃね?
もうちょっと工夫したら特定のメソッドだけ静的に上書きできるんじゃないかな.
static if(name == "func") でもいいけど.