文字列化関数

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;
    }
}

これでどんな型でも、

ObjToString!(typeof(value)).toString(value)

で文字列化できる筈(未確認)。


と思ったのですが、連想配列の配列とか、配列の連想配列とか、連想配列連想配列とかの出力はダメでした。(難しいなぁ)


kurimuraさん、ありがとうございました。