On Tue, Apr 17, 2012 at 8:56 AM, Johannes Totz <johannes@jo-t.de> wrote:
On 16/04/2012 20:06, Igor R wrote:
>> just started playing with boost::shared_ptr.
>> How do I get a const iterator pointing to a shared_ptr pointing to a
>> const object? See code below, I'd like to prevent a MyItem being changed
>> through const iterators.
>
> IIUC, the following answers your question:
> http://www.boost.org/doc/libs/1_49_0/libs/smart_ptr/shared_ptr.htm#FAQ
> <<Q. Why is operator->() const, but its return value is a non-const
> pointer to the element type?
> A. Shallow copy pointers, including raw pointers, typically don't
> propagate constness. It makes little sense for them to do so, as you
> can always obtain a non-const pointer from a const one and then
> proceed to modify the object through it.shared_ptr is "as close to raw
> pointers as possible but no closer".>>

Got a recommendation as to how to get this const-correct? I'm kinda
clueless right now... Or does the above faq mean it just cant be done?


struct MyItem
{
       int     value;
};

struct MyContainer
{
protected:
       typedef std::set<boost::shared_ptr<MyItem> >    MySet;
       MySet   set;

public:
       MySet::iterator stuff_begin();

       // should not change ptr nor MyItem nor set
       XXX::const_iterator stuff_begin() const;
};

Maybe you can use a transform_iterator to map the shared_ptr<MyItem> to a shared_ptr<MyItem const> (if such a conversion exists, I'm not sure)?

- Jeff