2

のを含むクラスがstd::setありboost::weak_ptr<T>ます。イテレータをコンテナに返す2つの関数begin()とend()があります。ただし、クライアントが変更できるようにしたくありませんT。が指しているものは編集可能であるため、単に返すだけでconst_iteratorは機能しません。Tboost::weak_ptr

私がやりたいのはにを返すことconst_iteratorですstd::set<boost::weak_ptr<T const> >。からのキャストはstd::set<boost::weak_ptr<T> >::const_iterator機能しません。私が望む振る舞いを得る方法はありますか?

4

1 に答える 1

5

をに変換する変換イテレータを作成できます。すでにBoostを使用しているので、次を使用できます。weak_ptr<T>weak_ptr<const T>boost::transform_iterator

#include <boost/iterator/transform_iterator.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>

#include <set>

// Functor to transform a weak_ptr<T> to a weak_ptr<const T>
template <typename T>
struct make_weak_ptr_const
    : std::unary_function<boost::weak_ptr<T>, boost::weak_ptr<const T> >
{
    boost::weak_ptr<const T> operator()(const boost::weak_ptr<T>& p) const
    {
        return p;
    }
};

struct S { };

// Container demonstrating use of make_weak_ptr_const:
struct my_awesome_container
{
    typedef std::set<boost::weak_ptr<S> > BaseSet;
    typedef BaseSet::const_iterator       BaseIterator;

    typedef boost::transform_iterator<
                make_weak_ptr_const<S>, 
                BaseIterator
            > iterator;

    iterator begin() const 
    {
        return TransformedIterator(data.begin());
    }

    iterator end() const
    {
        return TransformedIterator(data.end());
    }

    std::set<boost::weak_ptr<S> > data;
};

を使用したくない場合boost::transform_iteratorは、独自に作成するのは簡単な作業です。別の質問への回答でこれを行う方法を示しました。

于 2011-03-26T18:57:54.303 に答える