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にしておいた.多分用途が間違っている.