由于ostream_iterator的类模板比较简单,就不需要适配器辅助函数创建其对象,可以直接指定模板参数创建对象。
template<class InputIterator, class OutputIterator>//函数模板
OutputIterator
my_copy(InputIterator first, InputIterator last, OutputIterator result)
{
while (first != last)
{
*result = *first;//等下会对=进行重载
++result;
++first;
}
return result;
}
template<class T, class charT = char, class traits = char_traits<charT>>
class my_ostream_iterator :public iterator<output_iterator_tag, void, void, void, void>
{
basic_ostream<charT, traits>*out_stream;
const charT* delim;
public:
typedef charT char_type;
typedef traits traits_type;
typedef basic_ostream<charT, traits> ostream_type;
my_ostream_iterator(ostream_type&s) :out_stream(&s), delim(0) {};//constructor
my_ostream_iterator(ostream_type&s, const charT*delimter) :out_stream(&s), delim(delimter) {};//constructor-overloading
my_ostream_iterator(my_ostream_iterator<T, charT, traits>&x) :out_stream(x.out_stream), delim(x.delim) {};//copy constructor
~my_ostream_iterator() {};
my_ostream_iterator<T, charT, traits>&operator=(const T&value)
{
*out_stream << value;
if (delim != NULL)
*out_stream << delim;
return *this;
}
my_ostream_iterator<T, charT, traits>&operator++() { return *this; }
my_ostream_iterator<T, charT, traits> operator++(int) { return *this; }
my_ostream_iterator<T, charT, traits>&operator*() { return *this; }
};
int main()
{
vector<int>v;
for (int i = 1; i < 10; i++)
{
v.push_back(i * 10);
}
my_ostream_iterator<int>out_iter(cout, ",");//利用类模板创建对象
my_copy(v.begin(), v.end(), out_iter);
system("pause");
return 0;
}