艾伦·斯托克斯方法效果。下面的代码可以流式传输任何容器。我只需要为地图添加插入运算符
using namespace std;
#include <iostream>
#include <vector>
#include <list>
#include <forward_list>
#include <set>
#include <deque>
#include <array>
#include <map>
#include <unordered_map>
//...
//...needed for map types which are (key,value) pairs.
//...
template <typename K,typename V>
ostream&
operator<<
(ostream& p_os,const pair<const K,V>& p_v)
{
std::operator<<(p_os,'(');
p_os << p_v.first;
std::operator<<(p_os,',');
p_os << p_v.second;
std::operator<<(p_os,')');
return p_os;
}
template <typename C, typename T = typename C::iterator>
ostream&
operator<<
(ostream& p_os,const C& p_c)
{
for(typename C::const_iterator cit=p_c.begin();cit!=p_c.end();++cit)
{
typename C::value_type v = *cit;
p_os << v;
std::operator<<(p_os,",");
}
return p_os;
}
int
main
()
{
vector<int> v;
for(int i=0;i<4;++i)
{
v.push_back(i);
}
cout << v << endl;
list<int> l;
for(int i=0;i<4;++i)
{
l.push_back(i);
}
cout << l << endl;
forward_list<int> fl = {0,1,2,3};
cout << fl << endl;
set<int> s;
for(int i=0;i<4;++i)
{
s.insert(i);
}
cout << s << endl;
deque<int> d;
for(int i=0;i<4;++i)
{
d.push_back(i);
}
cout << d << endl;
array<int,4> a = {0,1,2,3};
cout << a << endl;
unordered_map<int,int> um;
for(int i=0;i<4;++i)
{
um[i] = i;
}
cout << um << endl;
map<int,int> m;
for(int i=0;i<4;++i)
{
m[i] = i;
}
cout << m << endl;
return 0;
}
这种方法做我想要的。我已经扩展了这个功能来支持流式处理所有的容器类型 – silvermangb 2014-12-07 03:26:52
“(尽管在没有某些enable_if技巧的情况下将它用于这样的全局函数可能是不明智的,因为它会以其他方式匹配任何参数。)”我尝试使用逗号分隔容器的条目,但编译器试图使用该函数来传输字符串。如何通过enable_if来避免这种情况? – silvermangb 2014-12-07 05:42:36
请参阅编辑(实际上并未使用'enable_if')。对于更复杂,更强大的解决方案,请参阅http://stackoverflow.com/questions/9242209/is-container-trait-fails-on-stdset-sfinae-issue。 – 2014-12-07 10:30:29