std :: set of boost :: weak_ptr <T> - 将const_iterator变为const T?

Dar*_*uuk 2 c++ boost iterator weak-ptr

我有包含类std::setboost::weak_ptr<T>.我有两个函数begin()和end()返回容器的迭代器.但是,我不希望客户能够修改T.简单地返回一个const_iterator将无法正常工作,因为T指向的boost::weak_ptr将是可编辑的.

我想要做的是返回const_iteratorstd::set<boost::weak_ptr<T const> >.铸造std::set<boost::weak_ptr<T> >::const_iterator不起作用.有没有办法得到我想要的行为?

Jam*_*lis 5

您可以编写转换迭代器以将其转换weak_ptr<T>为a weak_ptr<const T>.由于您已经在使用Boost,因此您可以使用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;
};
Run Code Online (Sandbox Code Playgroud)

如果您不想使用boost::transform_iterator,编写自己的任务是一项简单的任务.我在回答另一个问题时展示了如何做到这一点.