您可以編寫一個變換迭代器將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上展示瞭如何做到這一點。
您的這兩個陳述看起來是矛盾的:1)*我不希望客戶端能夠修改T *和2)*,因爲boost :: weak_ptr指向的T將是可編輯的。這是什麼意思? – Nawaz 2011-03-26 18:37:37
@Nawaz我的意思是:將'const_iterator'返回到'std :: set>'使得客戶端無法修改'weak_ptr'。但是,他仍然可以從中獲得'shared_ptr ',然後隨意修改'T'。這正是我不想要發生的事情。 –
Darhuuk
2011-03-27 01:57:30