$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Eric Niebler (eric_at_[hidden])
Date: 2003-10-09 14:05:29
Resending. Based on the number of private replies I got, I suspect there
is some interest in adding a foreach looping construct to Boost. The
lack of public discussion makes me wonder, though. Does no one want to
publically support an Ugly Macro? :-) Or is this just not compelling enough?
To recap, I'm suggesting the addition of BOOST_FOREACH to make it
trivial to write loops over sequences and containers of various sorts.
Typical usage:
std::list<int> int_list;
...
BOOST_FOREACH( int &i, int_list )
{
// mutates the int in the list:
i += 20;
// break works as you would expect
if ( i == 100 )
break;
}
--
Eric Niebler
Boost Consulting
www.boost-consulting.com
Eric Niebler wrote:
>
> In this month's CUJ, Anson Tsao of Microsoft and I describe one approach
> to implementing a FOR_EACH macro that makes it easy to loop over .NET
> collections in managed C++. I have reimplemented the code from scratch
> to work only with native types.
>
> You can use it as follows to loop over an STL collection, for example:
>
> std::list<int> int_list;
> ...
> BOOST_FOREACH( int &i, int_list )
> {
> // mutates the int in the list:
> i += 20;
> // break works as you would expect
> if ( i == 100 )
> break;
> }
>
> It has several advantages over std::for_each. In particular:
> - You don't have to define a predicate at namespace scope
> - You can break, continue, goto or return from the middle
> of the loop body.
> - In the loop body, you have complete access to the local
> variables from the surrounding code.
> - You don't need to worry about off-by-one errors, iterators,
> half-open sequences, binders, adapters, lambdas....
>
> It has a few advantages over the implementation described in the CUJ
> article:
> - It works with dependent types
> - It takes only 2 parameters, instead of 3
> - It doesn't require partial template specialization for reference
> loop variables
> - It is safer because it detects when the container is not an lvalue.
> - The code is much cleaner and shorter.
>
> I have uploaded the new implementation to:
> http://groups.yahoo.com/group/boost/files/BOOST_FOREACH/
>
> Right now, the code is self-contained, but if there is interest, I can
> boost-ify it by making use of boost::enable_if and
> boost::container_traits, once they are available.
>
> I have tested the code on VC7, VC7.1, gcc 3.2 on linux and cygwin on
> windows.
>
> So, any interest?
>
> Eric
>
> P.S. If you'd like to look at the older implementation for the CUJ, you
> can find it here: ftp://ftp.cuj.com/pub/2003/2111/nieblerTsao.zip
>
>
> _______________________________________________
> Unsubscribe & other changes:
> http://listarchives.boost.org/mailman/listinfo.cgi/boost
>