文字列化関数
1/22の日記にkurimuraさんからコメントをいただき、ある型が連想配列かどうかの判定を教えていただきました。
それを取り入れた、文字列化テンプレート。
template ObjToString(T) { char toString(T value) { char buffer; static if (is (T : char)) buffer = value; else static if (is (T : Object)) buffer = value.toString(); else static if (is (typeof(T.init.ptr))) buffer = ArrayToString!( typeof(*T.init.ptr) ).toString(value); else static if (is (typeof(T.init.keys[0] in T.init))) buffer = MapToString!( typeof(T.init.keys[0]), typeof(T.init.values[0]) ).toString(value); else buffer = std.string.toString(value); return buffer; } } template ArrayToString(T) { char toString(T[ ] array) { char buffer = "["; foreach(T value; array) buffer ~= ObjToString!(T).toString(value) ~ ","; buffer = chop(buffer); buffer ~= "]"; return buffer; } } template MapToString(Key, T) { char toString (T[Key] map) { char[] buffer = "["; foreach(Key key, T value; map) { buffer ~= "{"; buffer ~= ObjToString!(Key).toString(key); buffer ~= ":"; buffer ~= ObjToString!(T ).toString(value); buffer ~= "},"; } buffer = chop(buffer); buffer ~= "]"; return buffer; } }
これでどんな型でも、
で文字列化できる筈(未確認)。
と思ったのですが、連想配列の配列とか、配列の連想配列とか、連想配列の連想配列とかの出力はダメでした。(難しいなぁ)
kurimuraさん、ありがとうございました。