Если у меня есть класс, содержащий std::list<Foo>
и имеющий открытые методы begin()
и end()
для возврата итераторов для этого списка, как я могу реализовать дополнительные методы для возврата итераторов в std::list<Foo*>
, предпочтительно используя повышение?
Я бы предпочел не поддерживать параллельный контейнер указателей.
Edit:
У меня большая база кода, которую я хочу улучшить. Он имеет древовидную структуру данных с базовым классом, в котором есть метод для возврата дочерних объектов объекта:
class FooBase
{
// ...
virtual bool getChildren(std::vector<FooBase *>& children);
virtual size_t getChildrenCount() const { return 0; };
// ...
}
Существует шаблонный класс, который реализует коллекции дочерних объектов:
template <class T>
class FooCollection: public FooBase
{
public:
typedef typename std::list<T> ContainerType;
typedef typename ContainerType::iterator iterator;
typedef typename ContainerType::const_iterator const_iterator;
private:
ContainerType _items;
public:
// ...
const_iterator begin() const { return itemsM.begin(); };
const_iterator end() const { return itemsM.end(); };
iterator begin() { return itemsM.begin(); };
iterator end() { return itemsM.end(); };
virtual bool getChildren(std::vector<FooBase *>& children)
{
for (iterator it = itemsM.begin(); it != itemsM.end(); ++it)
children.push_back(&(*it));
return (itemsM.size() != 0);
};
// ...
};
В коде используются и итераторы, которые предоставляют различные классы FooCollection<>
(где класс известен), и FooBase::getChildren()
, когда он выполняет итерацию по дереву. Я думал, что FooBase::getChildren()
можно заменить итераторами, но, может быть, я ошибаюсь?