Скажем, у меня есть виртуальный базовый класс Base
, который частично будет вести себя как контейнер с двумя производными классами VectorLike
и RangeLike
. Я хочу, чтобы достичь чего-то вроде следующего:Возвращение различных итераторов с виртуальными производными методами
class VectorLike : public Base {
std::vector<int> data;
public:
virtual std::vector<int>::const_iterator cbegin() { return data.cbegin() }
virtual std::vector<int>::const_iterator cend() { return data.cend() }
}
class RangeLike : public Base {
int min, max;
class const_iterator {
int x;
public:
int operator++() { return ++x }
bool operator==(const_iterator rhs) { return x == rhs.x }
const_iterator(int y) { x = y }
}
public:
virtual const_iterator cbegin() { return const_iterator(min); }
virtual const_iterator cend() { return const_iterator(max); }
}
Этот код не будет компилироваться, так как std::vector<int>::const_iterator
и RangeLike::const_iterator
не являются идентичными или covariant. Чтобы достичь второго, мне нужен базовый класс итератора, из которого будут получены и std::vector<int>::const_iterator
, и RangeLike::const_iterator
. Но тогда еще cbegin()
и cend()
должны будут возвращать указатели на итераторы, которые сделают еще больший беспорядок.
Мой вопрос в том, можно ли достичь чего-то подобного вышеуказанному коду, и если да, то как?
Возможный дубликат (http://stackoverflow.com/questions/4222279/it -is-possible-to-change-return-type-when-override-a-virtual-function-in-c) –
Вам понадобится ваш собственный полиморфный тип итератора, который обертывает векторный итератор и итератор диапазона –
В этом случае производные классы должны быть известны заранее. Если я решит ввести третий производный класс, я должен отредактировать базовый итератор. Это, и я в основном храню двойные итераторы, которые я хочу хранить, что вряд ли кажется оптимальным. – MadPidgeon