近期写一些代码经常需要打印出容器结果,主要是给自己看看结果正确性。
不想每次自己写几层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);
}
}