2011-02-28 40 views
1

期待基類的列表我有以下類傳遞派生類的列表的功能在C++

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

回答

5

「最好」的辦法是有功能拍攝一對迭代:

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

您可以將此功能稱爲:

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

ta有很多優點王一對迭代器,而不是一個容器,但在這裏,兩個大的是

  • computeStuff函數可以接受的範圍內的任何類型的容器,而不僅僅是一個std::vector

  • 的範圍只需包含可轉換爲您想要使用的類型的對象(例如, boost::shared_ptr<Parent>),它實際上不必包含該特定類型的對象。