|
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