【问题标题】:Dereference adapter for iterator of pointers指针迭代器的取消引用适配器
【发布时间】:2013-07-12 16:10:11
【问题描述】:

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

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 中是否有类似此类的内容?

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

【问题讨论】:

标签: c++ boost stl iterator adapter


【解决方案1】:

Boost 有 indirect_iterator,它专门用于将迭代器包装成指针类型并自动取消引用。

【讨论】:

    猜你喜欢
    • 2019-01-24
    • 2012-11-01
    • 2012-07-11
    • 2017-04-13
    • 2013-06-05
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多