indirect_iterator地图<T,shared_ptr<U>>

indirect_iterator for map<T, shared_ptr<U>>

本文关键字:lt gt ptr shared 地图 indirect iterator      更新时间:2023-10-16

我正在尝试实现map<T, shared_ptr<U>>的迭代器,该迭代器"删除"shared_ptr,即对pair<T, U&>的取消引用。我需要这一点来将map上的包装器调整为基于范围的for循环。

boost::indirect_iterator似乎是为这种需求而设计的。我试过这个:

typedef std::map<int, std::shared_ptr<int>> M;
typedef boost::indirect_iterator<M::iterator, std::pair<int, int>> It;

这不起作用,因为indirect_iterator要求:

表达式*v(其中v是迭代器类型::value_type的对象(应为有效表达式,并可转换为引用

这个任务可以使用boost::indirect_iterator吗?如果没有,我可以用boost::iterator_adaptor吗?

感谢@Xeo的评论,解决方案是使用Boost.Range

#include <boost/range/adaptor/map.hpp>
#include <boost/range/adaptor/indirected.hpp>
#if defined(_MSC_VER) && _MSC_VER <= 1600 // VC10
    template< class T >
    typename std::add_rvalue_reference<T>::type declval();
#endif
class Wrapper
{
private:
    typedef std::map<T, std::shared_ptr<U>> Container;
public:
    typedef decltype(declval<Container&>() | boost::adaptors::map_values | boost::adaptors::indirected) IteratorRange;
    typedef decltype(declval<Container&>() | boost::adaptors::map_values | boost::adaptors::indirected) ConstIteratorRange;
    typedef IteratorRange::iterator Iterator;
    typedef ConstIteratorRange::const_iterator ConstIterator;
    Iterator begin()
    {
        return iteratorRange().begin();
    }
    // by analogy
    ConstIterator begin() const;
    ConstIterator cbegin() const;
    Iterator end();
    ConstIterator end() const;
    ConstIterator cend() const;
private:
    IteratorRange iteratorRange()
    {
        return container | boost::adaptors::map_values | boost::adaptors::indirected;
    }
    ConstIteratorRange iteratorRange() const;
private:
    Container container;
};