2013-03-22 137 views
2

我试图实现一个迭代器map<T, shared_ptr<U>>“删除”shared_ptr,即对pair<T, U&>的解除引用。我需要这个来调整我的包装map到基于范围的for循环。indirect_iterator for map <T,shared_ptr <U>>

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做这个吗?

+3

'map | boost :: adapters :: map_values | boost :: adapters :: indirected' – Xeo 2013-03-22 18:31:57

回答

2

感谢@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; 
}; 
+1

而不是hacky casts,只需使用'declval '。 VC10不幸忘了它,但它很短:'template typename std :: add_rvalue_reference :: type declval();' - 未定义,因此它只能用于未评估的上下文中。现在只需使用'decltype(declval ()| map_values | indirected)'。 – Xeo 2013-03-23 00:16:12

+0

@Xeo:tnx,已应用 – 2013-03-25 10:11:32

相关问题