文字列化テンプレート

配列だと、printf("%s") で出力できるが、連想配列だと化けて出力されるので、汎用の文字列化関数を作ってみた。

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                             buffer = std.string.toString(value);
        return buffer;
    }
}


template MapString(Key, T) {
    char toString (T[Key] map) {
        char[] buffer = "[";
        foreach(Key key, T value; map) {
            buffer ~= ObjToString!(Key).toString(key);
            buffer ~= ":";
            buffer ~= ObjToString!(T  ).toString(value);
            buffer ~= ",";
        }
        buffer = chop(buffer);
        buffer ~= "]";
        return buffer;
    }
}

ただしこれ、なんでもできるわけではなく、Key や T が、char 以外の配列でできていたらアウトである。
is 式で、配列かどうかの判定ができるとよいのだが……
それと型が組み込み型かどうかの判定もできるともっと吉。