iterator_adaptor Question

I have a class that holds a container of pointers to polymorphic Base classes. I'd like clients who iterate over those Bases using a mutating iterator type to be able to call non-const Base class member functions (but I do not want those clients to be able to replace the Base* directly). I'd also like clients who iterate using a const_iterator type to be able to call only const Base class member functions. In the following test code, I've attempted to use boost::iterator_adaptor to create a const iterator with these properties, but the const_iterator still allows calls to non-const operations. Can anyone help me see where I've gone wrong? #include <boost/iterator_adaptors.hpp> #include <boost/utility.hpp> #include <iostream> #include <list> class Base : private boost::noncopyable { public: virtual ~Base() {} virtual void foo() const = 0; }; class Derived : public Base { public: virtual void foo() const { std::cout << "Derived::foo" << std::endl; } }; struct Bases { typedef std::list<Base*> Bases_imp; typedef boost::iterator_adaptor< Bases_imp::iterator, boost::default_iterator_policies, Base*, Base* const&, Base* const*
iterator;
typedef boost::iterator_adaptor< Bases_imp::const_iterator, boost::default_iterator_policies, Base const*, Base const* const&, Base const* const*
const_iterator;
void foo() const { const_iterator i(bases_.begin()); const_iterator end(bases_.end()); for (; i != end; ++i) (*i)->foo(); // Oops - const_iterator allows call to non-const method } Bases_imp bases_; };
participants (3)
-
David Abrahams
-
greg_hickman3
-
Hickman, Greg