Передача списка производных классов в функцию, ожидающую список базовых классов в C ++ - PullRequest
1 голос
/ 28 февраля 2011

У меня есть следующие классы

class Parent {
  virtual void doStuff() = 0;
};

class Child : public Parent {
  void doStuff() {
    // Some computation here
  }
};

И у меня есть функция со следующей подписью.

void computeStuff(std::vector<boost::shared_ptr<Parent> >);

При условии, что я могу реорганизовать свой код (включая сигнатуру функции), Каков наилучший способ передачи функции computeStuff списка указателей на Child объектов?

По сути, я хотел бы, чтобы следующий фрагмент кода компилировался и выполнялся

std::vector<boost::shared_ptr<Child> > listOfChilds = getList();
computeStuff(listOfChilds);

1 Ответ

5 голосов
/ 28 февраля 2011

«Лучшим» способом было бы, чтобы функция брала пару итераторов:

template <typename ForwardIterator>
void computeStuff(ForwardIterator first, ForwardIterator last) {
    /* ... */
}

Вы можете вызвать эту функцию как:

std::vector<boost::shared_ptr<Child> > listOfChilds = getList();
computeStuff(listOfChilds.begin(), listOfChilds.end());

Есть многоПреимущество использования пары итераторов вместо контейнера, но здесь есть два больших преимущества:

  • функция computeStuff может принимать диапазон от любого типа контейнера, а не только отstd::vector и

  • диапазон просто должен содержать объекты, которые можно преобразовать в тип, который вы хотите использовать (например, boost::shared_ptr<Parent>), на самом деле он не должен содержатьобъекты этого конкретного типа.

...