将派生类列表传递给需要 C++ 中基类列表的函数
Posted
技术标签:
【中文标题】将派生类列表传递给需要 C++ 中基类列表的函数【英文标题】:Passing a list of derived classes to a function expecting a list of base classes in C++ 【发布时间】:2011-02-28 05:44:42 【问题描述】:我有以下课程
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
对象的指针列表的最佳方式是什么?
本质上,我想编译和运行下面的 sn-p 代码
std::vector<boost::shared_ptr<Child> > listOfChilds = getList();
computeStuff(listOfChilds);
【问题讨论】:
【参考方案1】:“最好”的方法是让函数采用一对迭代器:
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>
),实际上不必包含该特定类型的对象。
【讨论】:
以上是关于将派生类列表传递给需要 C++ 中基类列表的函数的主要内容,如果未能解决你的问题,请参考以下文章