g++のエラーメッセージを読み易くする

c++言語でテンプレート関連のコンパイルエラーは非常に読みにくいです。
ですがインデントすれば結構読み易くなります。
例えば以下のようg++からのコンパイル エラーメッセージ

src/gpuppur/cpu/cpu_raytracer.hpp:479: error: `void gpuppur::cpu_raytracer::erase(const typename gpuppur::cpu_raytracers::detail::instance3d::iterator&) [with UserDataType = gpuppur::material]' is private

をインデントすると

src/gpuppur/cpu/cpu_raytracer.hpp:479: error: `void gpuppur::cpu_raytracer
<
	UserDataType
>::erase
(
	const typename gpuppur::cpu_raytracers::detail::instance3d
	<
		UserDataType
	>::iterator&
) 
[
	with UserDataType = gpuppur::material
]' is private

と読み易くなります。

そこでこのようなインデントを自動的にやってくれるc++のプログラムを作りました。
標準入力から読み込んだ内容を自動的にインデントして標準出力に出します。<>()[],
の文字に関してだけ整形を行ないます。
少し面倒なのでインデントはtabで行なうようにしか作ってません。
g++ ver3.4.4でコンパイル、動作確認です。
こういうのはRubyとかPerlで書けば楽なのかもしれませんが、全然使ったことがないorz

#include <algorithm>
#include <iostream>
#include <numeric>
#include <string>
#include <vector>

using namespace std;

class indenter
{
private:

	int get_lev() const
	{
		return accumulate(this->levels.begin(), this->levels.end(), 0);
	}

	string level_up(const char c, const int index)
	{
		string ret;

		ret.push_back('\n');
		ret.append(this->get_lev(), '\t');
		this->levels[index]++;
		ret = (ret+c)+'\n';
		ret.append(this->get_lev(), '\t');

		return ret;
	}

	string level_down(const char c, const int index)
	{
		string ret;

		ret.push_back('\n');
		this->levels[index]--;
		ret.append(this->get_lev(), '\t');
		ret.push_back(c);

		return ret;
	}

public:

	indenter(const string& target_list):
		target_list(target_list), levels(target_list.size()/2)
	{
	}

	string convert(const string& src)
	{
		fill(this->levels.begin(), this->levels.end(), 0);

		string ret;

		string::const_iterator i=src.begin();
		for(;i!=src.end(); ++i)
		{
			for(int j=0; j<target_list.size(); j+=2)
			{
				if(*i==this->target_list[j])
				{
					ret+=this->level_up(this->target_list[j], j/2);
					goto contiunue;
				}
				if(*i==this->target_list[j+1])
				{
					ret+=this->level_down(this->target_list[j+1], j/2);
					goto contiunue;
				}
			}

			switch(*i)
			{
			case ',':
				ret.append(string(",\n"));
				ret.append(this->get_lev(), '\t');
				break;

			default:
				ret.push_back((*i));
				break;
			}

		contiunue:;
		}

		return ret;
	}

private:

	string target_list;
	vector<int> levels;
};

int main()
{
	string line;

	indenter conv("<>()[]");

	while(getline(cin, line))
	{
		cout <<
		conv.convert(line)
		<< endl;
	}
}