У меня есть класс, который производит значения, с интерфейсом, как это:Правильного способ реализации итератора абстрактного производителя со ссылкой семантикой
template<class T>
class Generator
{
public:
void advance();
T* get();
bool done();
//...
};
advance
функция продвигает производитель и помещает указатель на новый значение во внутреннем хранилище. Функция get
возвращает этот указатель, или nullptr
, если Generator
сделан (хотя Generator
может производить nullptrs
в процессе нормальной работы, также). done
возвращает значение true, если значение Producer
сделано с получением значений. get
возвращает указатель, позволяющий клиенту взаимодействовать с полученным значением, потенциально передавая информацию обратно на Generator
.
Казалось бы, было бы очень просто реализовать итератор. Класс Generator
не копируется, поэтому сам он не может быть итератором, поэтому я создал простую оболочку с необходимыми операциями. Проблема, с которой я столкнулся, - это оператор post-increment; продвижение Generator
аннулирует старый указатель. Я играл с разными идеями, но ни один из них не позволяет мне удовлетворить все требования к входному итератору или выходному итератору. Я не хочу, чтобы мои итераторы имели копию значения, потому что я хотел бы иметь ссылочную семантику через указатель. Самое близкое, что я пришел, это иметь итераторы для хранения счетчика приращений и только продвигать Generator
на операцию разыменования или сравнения. Это inloes const_cast
и, кроме того, очень опасно. Есть ли способ реализовать правильный итератор для этого интерфейса?
Правильно ли я прав: наличие действительного итератора i; другой итератор j = i; и ++ j аннулирует i!? –
Во всяком случае, 'i == j' не может (не может) подразумевать' ++ i == ++ j', поэтому он ограничен вводами итераторов ввода. –
Недействительно это для разыменования, да. Это нормальное поведение, допускаемое концепцией [InputIterator] (http://en.cppreference.com/w/cpp/concept/InputIterator).Проблема в том, что, хотя старые устаревшие старые итераторы недействительны, * it ++ все еще должен работать. – Lucretiel