[Iterator]Can dereference() in iterator_adaptor return a temporary value?
Hi, I'd like a const iterator that acts as a proxy by giving access to elements of type A as if they were elements of unrelated type B. In that case I guess the dereference() member function should return a temporary value, right? Would that be a correct implementation of the idea? Here I just want to access an array of SourceVertexType as if it were an array of VertexType. template<class VertexType> class ConstVerticesIterator : public boost::iterator_adaptor< ConstVerticesIterator<VertexType>, const SourceVertexType*, const VertexType
{ private: friend class boost::iterator_core_access; VertexType dereference() const { const SourceVertexType& source_vertex( *base() ); return VertexType( source_vertex.x, source_vertex.y ); } public: explicit ConstVerticesIterator( const SourceVertexType* vertices ) : boost::iterator_adaptor< ConstVerticesIterator<VertexType>, const SourceVertexType*, const VertexType >( vertices ) {} };
Hi, I'd like a const iterator that acts as a proxy by giving access to elements of type A as if they were elements of unrelated type B. In that case I guess the dereference() member function should return a temporary value, right? Would that be a correct implementation of the idea? Here I just want to access an array of SourceVertexType as if it were an array of VertexType.
template<class VertexType> class ConstVerticesIterator : public boost::iterator_adaptor< ConstVerticesIterator<VertexType>, const SourceVertexType*, const VertexType >
Yes, this is fine. This is what transform_iterator does. However, you should specify the fourth template parameter of iterator_adaptor (Reference) to be "const VertexType" as well, otherwise it will default to "const VertexType&" and operator* will return a reference to the temporary rather than returning a copy. Regards, Nate
Thanks, I added that parameter and it seems to work fine.
participants (2)
-
Nathan Ridge
-
Remi