5
我有一個容器負責管理一組屬性。該類部分看起來像這樣:指針迭代器的解引用適配器
class AttributeSet
{
public:
// ... interface is irrelevant for my question.
private:
std::vector<boost::shared_ptr<Attribute> > m_attributes;
};
屬性是多態的,所以屬性必須存儲爲指針,但它們不能爲NULL。
我想使用這個類BOOST_FOREACH,就像這樣:
BOOST_FOREACH(const Attribute &attribute, attributeSet)
{
...
}
據BOOST_FOREACH文檔,
對STL容器的支持是很一般;任何看起來像STL容器的東西都是重要的。如果它具有嵌套的iterator和const_iterator類型以及begin()和end()成員函數,BOOST_FOREACH將自動知道如何遍歷它。
所以我更新了我的班是這個樣子:
class AttributeSet
{
public:
typedef std::vector<boost::shared_ptr<Attribute> > container;
typedef container::iterator iterator;
typedef container::const_iterator const_iterator;
iterator begin();
iterator end();
const_iterator begin() const;
const_iterator end() const;
private:
container m_attributes;
};
所以,現在我可以這樣做:
BOOST_FOREACH(const boost::shared_ptr<Attribute> &attribute, attributeSet)
{
...
}
這是不錯的,但是我不喜歡它公開屬性作爲指針。從來電方來說,這是噪音,會產生毫無意義的NULL檢查。
我對如何糾正問題有幾點想法。例如,這樣的事情會很好:
class AttributeSet
{
public:
typedef std::vector<boost::shared_ptr<Attribute> > container;
typedef iterator_dereference_adapter<container::iterator> iterator;
typedef iterator_dereference_adapter<container::const_iterator> const_iterator;
iterator begin() { return iterator(m_attributes.begin()); }
iterator end() { return iterator(m_attributes.end()); }
const_iterator begin() const { return const_iterator(m_attributes.begin()); }
const_iterator end() const { return const_iterator(m_attributes.end()); }
private:
container m_attributes;
};
'iterator_dereference_adapter'類有點不言自明。它會包裝現有的指針迭代器並取消指針值。
所以最後,我的問題 ...
之前,我走下車,並嘗試寫這個適配器,是有什麼在STL或升壓像這樣的課嗎?
我接受其他想法。
Boost有一個[間接迭代器](http://www.boost.org/doc/libs/1_54_0/libs/iterator/doc/indirect_iterator.html)。 –
不錯的問題。 +1。 – 2013-07-12 18:10:20