【问题标题】:indirect_iterator for map<T, shared_ptr<U>>map<T, shared_ptr<U>> 的间接迭代器
【发布时间】:2013-03-12 17:11:26
【问题描述】:

我正在尝试实现一个“删除”shared_ptrmap&lt;T, shared_ptr&lt;U&gt;&gt; 迭代器,即取消对 pair&lt;T, U&amp;&gt; 的引用。我需要这个来调整 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 是 iterator_traits::value_type 的对象,应该是有效的表达式并且可以转换为引用。

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

【问题讨论】:

  • map | boost::adaptors::map_values | boost::adaptors::indirected

标签: c++ boost c++11 iterator boost-iterators


【解决方案1】:

感谢@Xeo 的评论,解决方案是使用 Boost.Range。我设法从 VC10 得到什么

#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;
};

【讨论】:

  • 使用declval&lt;T&gt; 而不是hacky casts。不幸的是,VC10 忘记了它,但它很短:template&lt;class T&gt; typename std::add_rvalue_reference&lt;T&gt;::type declval(); - 未定义,因此只能在未评估的上下文中使用。现在只需使用decltype(declval&lt;Container&amp;&gt;() | map_values | indirected)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 2013-07-21
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 2014-06-25
相关资源
最近更新 更多