The only way I could see this different from Jeff proposal is if somehow yous functor to transform the result is dependant on the traversal of the sequence or the order of the element.
Other I don't see why you couldn't do my_algo(input_range | trasnformed(func), out).

Cheers, 

Stephane

On Mon, Aug 3, 2015 at 12:03 PM dariomt <dariomt@gmail.com> wrote:
Jeff Flinn <jeffrey.flinn <at> gmail.com> writes:

>
> On 7/31/15 8:40 AM, dariomt wrote:
> > Edward Diener <eldiener <at> tropicsoft.com> writes:
> >
> >>
> >> On 7/30/2015 7:06 AM, dariomt <at> gmail.com wrote:
> >>> Here is my problem: for any given algorithm that writes its output
> > into
> >>> an output iterator, I'd like to apply a transformation *before*
> > writing
> >>> to the output iterator.
> >>>
> >>> e.g. inside the algorithm the output iterator is dereferenced and
> >>> incremented to write each result, typically like this:
> >>>
> >>> *output++ = ith_result;
> >>>
> >>> I'd like to wrap the output iterator with a unary function func
such
> >>> that the effect is equivalent to:
> >>>
> >>> *output++ = func( ith_result );
> >>>
> >>> I'm looking at the adaptors in Boost.Iterator but I cannot find a
> >>> suitable one.
> >>>
> >>> Am I missing anything?
> >>> Is there a better approach?
> >>
> >> Can you not use the function_output_iterator to accomplish what you
> > want
> >> to do ?
> >>
> >
> > IIUC the function_output_iterator "fakes" an output iterator with a
> > function object that gets called for each element written to the
> > iterator.
> >
> > I need to wrap *both* an actual output iterator and a function
object,
> > and I need to apply the function *before* writing to the actual
output
> > iterator.
> >
> > Given that the output iterator is written by dereference and
assignment,
> > I think I would need some kind of proxy reference, that when assigned
to
> > applies the function before doing the actual assignment.
> >
> > That looks ugly, so I'm asking here for a more elegant solution :)
>
> how is what you want to do different from:
>
> boost::copy( myrange | transformed(func), outputitr );
>
> Jeff
>

What if myrange is the output of an algorithm, but I don't want to copy
it into an intermediate range?

e.g.
template <typename InputIter, typename OutputIter>
void my_algo(InputIter first, InputIter last, OutputIter out)
{
  // complex loop traversing input sequence
  ...
  // some complicated code to compute each result
  ...
  // write each result to output iterator
  *out++ = ith_result;
}

I know I could do it easily in two steps storing the intermediate
results.

intermediate_storage tmp;
my_algo(input.begin(), input.end(), back_inserter(tmp));
transform(tmp.begin(), tmp.end(), output);

But how to do it in one go, without requiring storage for intermediate
results?


_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users