ExtendedPointがPointを継承してないから意味がわからないコードになってた.
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 : Point { // 正しくはこう 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 }