2

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はiterator_traits :: value_typeのオブジェクト)は、有効な式であり、参照に変換可能である必要があります。

boost::indirect_iteratorこのタスクに使用することは可能ですか?いいえの場合、私はこれを行うことができboost::iterator_adaptorますか?

4

1 に答える 1

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;
};
于 2013-03-22T20:37:01.987 に答える