Boost logo

Boost Users :

Subject: Re: [Boost-users] [fusion] iterating over a sequence with non-const references
From: Dave Abrahams (dave_at_[hidden])
Date: 2012-03-31 22:18:31


on Sat Mar 31 2012, paul Fultz <pfultz2-AT-yahoo.com> wrote:

> Hi,
> I would like to iterate over a sequence and preserve the
>
> reference/const/non-const of the elements. That is say I have
> a sequence like this:
>
>     tuple<int&, int> seq;
>
> I would like to this to be true:
>
>     typeof(deref(begin(seq))) == int&
>     typeof(deref(next(begin(seq)))) == int&&
>
> It seems fusion sequences always return a const reference to
> the element. Is there a workaround to get it to work like this?

Trust me, you don't want that, for roughly the same reason you don't
want regular sequence rvalues to have rvalue-returning iterators:
https://groups.google.com/d/msg/comp.lang.c++.moderated/1BwNTHCFiOs/L1T3WC9T_kMJ

> Or is this just not possible with Boost.Fusion?

I think you'd need to create your own iterator fusion-style iterator for
this purpose.

> Furthermore, I would like to use the transformation algorithms
> (especially push_back, and push_front) and still preserve the
> reference type.

Sorry, I don't know what that means. How could using an algorithm
change a sequence's (or iterator's?) reference type?

> Is that possible, through some workarounds? Finally, would it still
> be fairly efficient when dealing with references, to copy the tuple
> and make a new tuple when doing algorithms such as push_back or
> push_front? Or is the lazy evaluation much more efficient than that?

This part is best answered by others.

-- 
Dave Abrahams
BoostPro Computing
http://www.boostpro.com

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