#include #include #include #include struct copy_clone_allocator { template< class T > T allocate_clone( const T& r ) { return r; } template< class T > void deallocate_clone( const T* ) { // do nothing } }; template< class T > struct indirect_value { typedef typename boost::iterator_value::type type; }; template < class T, class CloneAllocator = copy_clone_allocator, class Allocator = std::allocator > class indirect_vector { typedef std::vector vec; vec vec_; public: typedef boost::indirect_iterator iterator; typedef T value_type; typedef typename indirect_value::type indirect_value; typedef indirect_value& reference; public: void push_back( const T& r ) { vec_.push_back( r ); } iterator begin() { return iterator( vec_.begin() ); } iterator end() { return iterator( vec_.end() ); } reference front() { return *begin(); } reference back() { return *--end(); } }; template < class T, /* can be T, nullable or viewable class CloneAllocator = /* link: see below */, class Allocator = /* link: see below */ > class indirect_vector { }; indirect_vector< boost::viewable >; + byt om på policies (?) indirect_vector< booot::nullable >; indirect_vector< T >; indirect_vector< viewable< share_ptr > >; #include #include int main() { using namespace boost; typedef std::vector::iterator iter_t; indirect_vector vec; indirect_vector vec2; std::vector source; source.push_back( 5 ); vec.push_back( source.begin() ); vec.front() = 5; assert( vec.front() == 5 ); assert( *vec.begin() == 5 ); }