C
Hallo Dravere,
danke für Deine Antwort. Mit viel Mühe habe ich ausgehend vom verlinkten Code eine Klasse istream_pos_iterator erstellt. Sie sieht wie folgt aus:
namespace std
{
template <class T, class charT=char, class traits=char_traits<charT>, class Distance=ptrdiff_t>
class istream_pos_iterator : public iterator<input_iterator_tag, T, Distance, const T*, const T&>
{
basic_istream<charT,traits>* in_stream;
T value;
int position;
public:
typedef charT char_type;
typedef traits traits_type;
typedef basic_istream<charT,traits> istream_type;
istream_pos_iterator() : in_stream ( 0 ) {}
istream_pos_iterator ( istream_type& s ) : in_stream ( &s ), position(-1) { ++*this; }
istream_pos_iterator ( const istream_pos_iterator<T,charT,traits,Distance>& x )
: in_stream ( x.in_stream ), value ( x.value ), position(x.position) {}
~istream_pos_iterator() {}
const T& operator*() const { return value; }
const T* operator->() const { return &value; }
istream_pos_iterator<T,charT,traits,Distance>& operator++()
{
position = in_stream->tellg();
if ( in_stream && ! ( *in_stream >> value ) ) in_stream=0;
return *this;
}
istream_pos_iterator<T,charT,traits,Distance> operator++ ( int )
{
istream_pos_iterator<T,charT,traits,Distance> tmp = *this;
++*this;
return tmp;
}
int tell() { return position; }
bool equal(const istream_pos_iterator<T,charT,traits,Distance>& o) const
{
if (!this->in_stream) {
return (!o.in_stream); // EQUAL if both are EOF iterators, otherwise NOT EQUAL
}
return this->position == o.position; // Otherwise compare position
}
};
template <class T, class charT, class traits, class Distance>
bool operator==(const istream_pos_iterator<T, charT, traits, Distance>& lhs, const istream_pos_iterator<T, charT, traits, Distance>& rhs) {
return lhs.equal(rhs);
}
template <class T, class charT, class traits, class Distance>
bool operator!=(const istream_pos_iterator<T, charT, traits, Distance>& lhs, const istream_pos_iterator<T, charT, traits, Distance>& rhs) {
return !lhs.equal(rhs);
}
}
Kann man das so stehen lassen? Was mir nicht gefällt ist die Funktion equal , aber ich hab es partout nicht geschafft, den Vergleichsoperator als friend zu deklarieren. Wie sähe die Deklaration in diesem Fall aus?