...ing logging 4.0

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

SimpleConstructorに触発されてDefaultStringizerを作ってみた

import std.stdio;
import std.conv;
import std.string;
import std.typetuple;

string reduce(S...)(S s, string sep) {
	static if (s.length == 1)
		return to!string(s[0]);
	else
		return to!string(s[0]) ~ sep ~ reduce(s[1..$], sep);
}

template DefaultStringizer() {
	string toString(){
		return format("[", reduce(this.tupleof,","), "]");
	}
}

class Point {
	int x, y;
	mixin DefaultStringizer;
}

class ExtendedPoint {
	override string toString()
	{
		return "overridable";
	}
}

void main()
{
	auto p = new Point;
	p.tupleof = TypeTuple!(3,4); // SimpleConstructorのおかげでこういうことができることに気がついた

	writefln("%s", p);                 // [3,4]
	writefln("%s", new ExtendedPoint); // overridable
}

toStringは頻繁に書くのでこれは便利かもしれない.

reduce

こういうことをよくしたくなるので作ってみたが関数名が思いつかなかったので適当にreduceにしておいた.多分用途が間違っている.