Boost logo

Boost Users :

From: Hickman, Greg (greg.hickman_at_[hidden])
Date: 2002-07-23 11:27:55


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_;
};


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net