当先锋百科网

首页 1 2 3 4 5 6 7

近期写一些代码经常需要打印出容器结果,主要是给自己看看结果正确性。

不想每次自己写几层for,所以写了下面的代码。

template<typename T>
void printcon(T& con, const string& split = " ")
{
	_PrintImpl<typename T::value_type>::template impl<T>(con, split);
}

template<typename T>
struct _PrintValue
{
	template<typename Conn>
	static void print(Conn& con, const string& split)
	{
		copy(con.begin(), con.end(), ostream_iterator<T>(cout, split.c_str()));
	}
};
template<typename T, typename U>
struct _PrintValue<pair<T,U> >
{
	template<typename Conn>
	static void print(Conn& con, const string& split)
	{
		for(typename Conn::iterator it = con.begin() ; it != con.end() ; ++ it)
			cout<<"k:"<<it->first<<" v:"<<it->second<<split;
	}
};


template<typename Con>
void _print_atomic(Con& con, const string& split)
{
	_PrintValue<typename Con::value_type>::print(con, split);
	//copy(con.begin(), con.end(), ostream_iterator<typename Con::value_type>(cout, split.c_str()));
	cout<<endl;
}
template<typename Con>
void _print_subcon(Con& con, const string& split)
{
	typedef typename Con::value_type subcon_t;
#if 0
	for(typename Con::iterator it = con.begin() ; it != con.end() ; ++ it)
		printcon<subcon_t>(*it, split);
#else
	for_each(con.begin(), con.end(), bind(printcon<subcon_t>, _Ph<1>(), split));
#endif
}

template<typename ElemT>
struct _PrintImpl
{
	template<typename Con>
	static void impl(Con& con, const string& split)
	{
		_print_atomic<Con>(con, split);
	}
};
template<typename T, typename Alloc>
struct _PrintImpl<vector<T, Alloc> >
{
	template<typename Con>
	static void impl(Con& con, const string& split)
	{
		_print_subcon<Con>(con, split);
	}
};
template<typename T, typename Alloc>
struct _PrintImpl<list<T, Alloc> >
{
	template<typename Con>
	static void impl(Con& con, const string& split)
	{
		_print_subcon<Con>(con, split);
	}
};

template<typename T, typename Pred, typename Alloc>
struct _PrintImpl<set<T, Pred, Alloc> >
{
	template<typename Con>
	static void impl(Con& con, const string& split)
	{
		_print_subcon<Con>(con, split);
	}
};

template<typename K, typename V, typename Pred, typename Alloc>
struct _PrintImpl<map<K, V, Pred, Alloc> >
{
	template<typename Con>
	static void impl(Con& con, const string& split)
	{
		_print_subcon<Con>(con, split);
	}
};

namespace test_printcon
{
	void main()
	{
		int a[] = {1,2,3,4,5};
		set<int> s(a, a + _countof(a));

		vector<int> v(a, a + _countof(a));

		list<vector<int> > lv;
		lv.push_back(v);
		lv.push_back(v);
		printcon(lv);

		set<vector<int> > sv;
		sv.insert(v);
		printcon(sv);


		vector<set<int> > vs;
		vs.push_back(s);
		vs.push_back(s);
		printcon(vs);

		map<int, int> m;
		m.insert(make_pair(1, 1));
		m.insert(make_pair(2, 2));

		list<map<int, int> > lm;
		lm.push_back(m);
		printcon(lm);
	}
}