Как @Some programmer dude
: объекты потока нельзя ни копировать, ни назначать, ни сравнивать.
Если вы хотите, чтобы он работал в образовательных целях, вы можете добавить в свой класс другого члена istrm_iter
, который отслеживает состояние потока, к которому он привязан, и в операторах in / равенства сравнивать итераторы,их внутреннее состояние хорошее или нет, если оба они хороши, то они равны, и это происходит, когда они равны off-end
, иначе они не равны:
Конструктор по умолчанию, который не привязывает итератор кпоток должен сделать внутреннее состояние плохим.
И ++
должен после каждого оператора ввода проверять, достигнет ли поток EOF
или сообщил об ошибке ввода-вывода, таким образом, он устанавливает состояние как плохое.что делает его равным построенному с конструктором по умолчанию (как внешний итератор).
Вот простое предложение:
template<class T>
struct istrm_it {
istrm_it() = default;
istrm_it(std::istream& in) :
in_(in), val_(T()),
is_good_(true) {
in_ >> val_;
}
bool is_good_ = false;
T val_ = T{};
std::istream& in_ = std::cin;
istrm_it& operator++() { in_ >> val_; if (!in_) is_good_ = false; return *this; };
istrm_it& operator++(int) { in_ >> val_; if (!in_) is_good_ = false; return *this; };
T operator*() { return val_; }
bool operator==(const istrm_it& rhs) const {
return is_good_ && rhs.is_good_ || !is_good_ && !rhs.is_good_;}
bool operator!=(const istrm_it& rhs) const{ return !(operator==(rhs)); }
};
и в основном:
int main(){
istrm_it<int> it(std::cin), e;
cout << *it << endl;
vector<int> vi;
while (it != e)
vi.push_back(*it++);
for (auto i : vi)
std::cout << i << ", ";
std::cout << std::endl;
}
Нет, это работает.NB. Это всего лишь пример, который я знаю, на самом деле требуется много вещей, чтобы имитировать класс, определенный стандартной библиотекой.