2011-03-26 80 views
2

我有班級,包含boost::weak_ptr<T>std::set。我有兩個函數begin()和end(),它們向容器返回一個迭代器。但是,我不希望客戶能夠修改T。簡單地返回const_iterator將不起作用,因爲boost::weak_ptr指向的T將是可編輯的。std :: set :: boost :: weak_ptr <T> - 將const_iterator轉換爲const T?

我想要做的是返回const_iteratorstd::set<boost::weak_ptr<T const> >。從std::set<boost::weak_ptr<T> >::const_iterator鑄造不起作用。有什麼方法可以獲得我想要的行爲嗎?

+0

您的這兩個陳述看起來是矛盾的:1)*我不希望客戶端能夠修改T *和2)*,因爲boost :: weak_ptr指向的T將是可編輯的。這是什麼意思? – Nawaz 2011-03-26 18:37:37

+0

@Nawaz我的意思是:將'const_iterator'返回到'std :: set >'使得客戶端無法修改'weak_ptr'。但是,他仍然可以從中獲得'shared_ptr ',然後隨意修改'T'。這正是我不想要發生的事情。 – Darhuuk 2011-03-27 01:57:30

回答

4

您可以編寫一個變換迭代器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上展示瞭如何做到這一點。

+0

謝謝,我不知道這樣的功能存在。太棒了! – Darhuuk 2011-03-27 01:40:41

相關問題