Listing 4: <iterator>, part 8


        // TEMPLATE CLASS istream_iterator
template<class T, class Dist = ptrdiff_t>
    class istream_iterator : public input_iterator<T, Dist> {
public:
    istream_iterator()
        : Istr(0) {}
    istream_iterator(istream& is)
        : Istr(&is) {_Getval(); }
    const T& operator*() const
        {return (Val); }
    const T *operator->() const
        {return (&**this); }
    istream_iterator<T, Dist>& operator++()
        {_Getval();
        return (*this); }
    istream_iterator<T, Dist> operator++(int)
        {istream_iterator<T, Dist> tmp = *this;
        _Getval();
        return (tmp); }
    bool Equal(const istream_iterator<T, Dist>& x) const
        {return (Istr == x.Istr); }
protected:
    void _Getval()
        {if (Istr != 0 && !(*Istr >> Val))
            Istr = 0; }
    istream *Istr;
    T Val;
    };

         // istream_iterator OPERATORS
template<class T, class Dist> inline
    bool operator==(const istream_iterator<T, Dist>& x,
        const istream_iterator<T, Dist>& y)
    {return (x.Equal(y)); }

        // TEMPLATE CLASS ostream_iterator
template<class T>
    class ostream_iterator : public output_iterator {
public:
    ostream_iterator(ostream& os, const char *Dist = 0)
        : Ostr(&os), Delim(Dist) {}
    ostream_iterator<T>& operator=(const T& x)
        {*Ostr << x;
        if (Delim != 0)
            *Ostr << Delim;
        return (*this); }
    ostream_iterator<T>& operator*()
        {return (*this); }
    ostream_iterator<T>& operator++()
        {return (*this); }
    ostream_iterator<T> operator++(int)
        {return (*this); }
protected:
    const char *Delim;
    ostream *Ostr;
    };
/* End of File */