В C ++, скажем, у меня есть базовый класс Base
, и многие дочерние классы являются его производными.Каждый дочерний класс содержит массив некоторого типа и длины.
class Base {
//...
int baseData;
virtual ChildIterator getBegin();
virtual ChildIterator getEnd();
};
class Child1 : public Base {
// ...
static const size_t CAPACITY = 5;
int ints[CAPACITY];
ChildIterator getBegin() { return &ints[0]; }
ChildIterator getEnd() { return &ints[CAPACITY]; };
};
class Child2 : public Base {
// ...
static const size_t CAPACITY = 7;
float floats[CAPACITY];
ChildIterator getBegin() { return &floats[0]; }
ChildIterator getEnd() { return &floats[CAPACITY]; };
};
Теперь я хочу сделать каждый дочерний класс итеративным, то есть я могу перебирать каждый элемент массива дочернего объекта, как в:
Base *p1 = new Child1(...);
Base *p2 = new Child2(...);
sort(p1->getBegin(), p1->getEnd());
// same as: sort(&((Child1)p1->ints[0]), &((Child1)p1->ints[5]));
sort(p2->getBegin(), p2->getBegin() + 3);
// same as: sort(&((Child2)p2->floats[0]), &((Child2)p2->floats[3]));
// Please note that sort() is not my intended operation on them;
// I just use it as an example because it involves iterators. I know
// I could just define sort() method in each child class.
Как мне реализовать класс ChildIterator
, чтобы он был действительным итератором произвольного доступа?
EDIT :
Типы в массиве:не просто int
или float
;это может быть Base *
или Child *
, и мне нужно получить доступ к Base
членам через ChildIterator
, если тип в массиве - Base *
.