我的课程包含std::set
boost::weak_ptr<T>
。我有两个函数begin()和end()返回容器的迭代器。但是,我不希望客户能够修改T
。只需返回const_iterator
即可生效,因为T
指向的boost::weak_ptr
将是可编辑的。
我想要做的是将const_iterator
返回std::set<boost::weak_ptr<T const> >
。从std::set<boost::weak_ptr<T> >::const_iterator
投射不起作用。有没有办法得到我想要的行为?
答案 0 :(得分:5)
您可以编写转换迭代器,将weak_ptr<T>
转换为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;
};
如果您不想使用boost::transform_iterator
,编写自己的任务是一项简单的任务。我在an answer to another question中展示了如何执行此操作。