2013-03-22 98 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

相關問題