Boost logo

Boost :

From: John E. Potter (jpotter_at_[hidden])
Date: 2000-12-31 20:44:37


On Fri, 29 Dec 2000, Arun Sivaramakrishnan wrote:

> Jeremy wrote:
> >
> > If you want to use a function returning a reference, use projection
> > iterator instead of transform.
>
> Same problem.

Not really. Transform has value semantics and projection has reference
semantics.

> Since we cannot have pointer to references or reference to references
> there are compiler errors when AdaptableUnaryFunction
> returns a reference type.
> As Dave said, we do need specializations to overcome this problem
> atleast for some compilers.

This is a lack of documentation. Projection_iterator has reference
semantics always. There is a general problem with reference template
parameters. Vector<int&>? Set<int&>? They just don't work. But,

struct RefFunc : public unary_function<SomeThing, int> {
   int& operator() (SomeThing& st) { return st.someIntField; }
   };

works fine with both std::unary_function and projection_iterator. It
is a lie which works well. The only purpose of std::unary_function is
to extract the correct value_type. Reference and pointer are always
value_type& and value_type*. The function object must have reference
semantics.

Improvements welcome. It could make transform and projection one
iterator.

John


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk