我经常想将 stl 容器写入 ostream。以下代码可以正常工作(至少对于向量和列表):
template< typename T ,template<typename ELEM, typename ALLOC=std::allocator<ELEM> > class Container >
std::ostream& operator<< (std::ostream& o, Container<T>const & container){
typename Container<T>::const_iterator beg = container.begin();
while(beg != container.end()){
o << *beg++;
if (beg!=container.end()) o << "\t";
}
return o;
}
现在我想扩展此代码以支持可自定义的分隔符。下面的方法显然行不通,因为运算符应该只采用两个参数。
template< typename T ,template<typename ELEM, typename ALLOC=std::allocator<ELEM> > class Container >
std::ostream& operator<< (std::ostream& o, Container<T>const & container,char* separator){
typename Container<T>::const_iterator beg = container.begin();
while(beg != container.end()){
o << *beg++;
if (beg!=container.end()) o << separator;
}
return o;
}
这样的事情可以在不诉诸单例或全局变量的情况下实现吗?
理想的做法是引入自定义标志或流操纵器,例如std::fixed
. 然后就可以写了
std::cout << streamflags::tabbed << myContainer;