将派生类的列表传递给期望C++中的基类列表的函数

pes*_*kal 1 c++ inheritance list vector shared-ptr

我有以下课程

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

class Child : public Parent {
  void doStuff() {
    // Some computation here
  }
};
Run Code Online (Sandbox Code Playgroud)

我有一个具有以下签名的功能.

void computeStuff(std::vector<boost::shared_ptr<Parent> >);
Run Code Online (Sandbox Code Playgroud)

如果我可以重构我的代码(包括函数签名),那么将函数传递computeStuffChild对象列表的最佳方法是什么?

从本质上讲,我希望编译和运行以下代码片段

std::vector<boost::shared_ptr<Child> > listOfChilds = getList();
computeStuff(listOfChilds);
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 5

"最好"的方法是让函数使用一对迭代器:

template <typename ForwardIterator>
void computeStuff(ForwardIterator first, ForwardIterator last) {
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

您可以将此功能称为:

std::vector<boost::shared_ptr<Child> > listOfChilds = getList();
computeStuff(listOfChilds.begin(), listOfChilds.end());
Run Code Online (Sandbox Code Playgroud)

使用一对迭代器而不是容器有很多优点,但这里有两个大的优点

  • computeStuff函数可以从任何类型的容器中获取范围,而不仅仅是a std::vector

  • 范围只需包含可转换为您要使用的类型的对象(例如boost::shared_ptr<Parent>),它实际上不必包含该特定类型的对象.