将派生类列表传递给需要 C++ 中基类列表的函数;

发布于 2024-10-19 09:26:01 字数 577 浏览 1 评论 0原文

我有以下课程

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);

I have the following classes

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

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

And I have a function with the following signature.

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

Provided I can refactor my code (including the function signature), what is the best way to pass the function computeStuff a list of pointers to Child objects?

Essentially, I would like the following snippet of code to compile and run

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

他是夢罘是命 2024-10-26 09:26:01

“最好”的方法是让函数采用一对迭代器:

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

您可以将此函数称为:

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

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

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

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

The "best" way would be to have the function take a pair of iterators:

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

You can call this function as:

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

There are a lot of advantages to taking a pair of iterators instead of a container, but the two big ones here are that

  • the computeStuff function can take a range from any type of container, not just a std::vector, and

  • the range just has to contain objects that are convertible to the type that you want to use (e.g. boost::shared_ptr<Parent>), it doesn't actually have to contain objects of that specific type.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文