【发布时间】:2018-10-30 19:48:30
【问题描述】:
在 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 类,使其成为有效的随机访问迭代器?
编辑:
数组中的类型不只是int或float;可能是Base *或Child *,如果数组中的类型是Base *,我需要通过ChildIterator访问Base的成员。
【问题讨论】:
-
@Jarod42 不 - 类型可以是任何类型,甚至是
Base * -
那么这是不可能的(一般来说)。
*ChildIterator{}应该是什么类型? -
@PasserBy: 具有某种
std::any的代理类型? -
我希望有一些聪明的技巧可以解决..
-
@Swift 它是循环的而不是递归的;)
标签: c++ iterator polymorphism