我有一个容器,负责管理一组属性。该类部分看起来像这样:
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 中是否有类似此类的内容?
我对其他想法持开放态度。