用于指针迭代器的解引用适配器

ked*_*ede 5 c++ boost iterator stl adapter

我有一个容器,负责管理一组属性.该类部分看起来像这样:

class AttributeSet
{
public:
    // ... interface is irrelevant for my question.

private:
    std::vector<boost::shared_ptr<Attribute> > m_attributes;
};
Run Code Online (Sandbox Code Playgroud)

属性是多态的,因此属性必须存储为指针,但它们永远不能为NULL.

我想在BOOST_FOREACH中使用这个类,如下所示:

BOOST_FOREACH(const Attribute &attribute, attributeSet)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

根据BOOST_FOREACH文档,

对STL容器的支持非常普遍; 任何看起来像STL容器的东西都很重要.如果它嵌套了迭代器和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;
};
Run Code Online (Sandbox Code Playgroud)

所以现在我可以这样做:

BOOST_FOREACH(const boost::shared_ptr<Attribute> &attribute, attributeSet)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

这很好但是我不喜欢它将属性公开为指针.从呼叫者方面来说,这是噪音并且会产生无意义的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;
};
Run Code Online (Sandbox Code Playgroud)

'iterator_dereference_adapter'类有点不言自明.它将包装指针的现有迭代器并取消引用指针值.

最后,我的问题 ......

在我开始尝试编写此适配器之前,STL或Boost中是否存在类似这样的内容?

我对其他想法持开放态度.

Cas*_*sey 7

Boost有indirect_iterator,它正好用于将迭代器包装到指针类型并自动解除引用.