On Sun, Dec 13, 2009 at 11:51 PM, Eric Niebler <eric@boostpro.com> wrote:
The Dude wrote:
 Hello,

 Boost::foreach is very useful for iterating over a sequence and doing something that depends only on the iterated element, e.g.,
<code>
BOOST_FOREACH(const Foo &f, foos)
 cout << f.bar() << endl;
</code>

 However, I often need to iterate over a sequence and do some operation that depends on both the iterated element and the iteration index. E.g., I would like something like
<code>
BOOST_FOREACH(size_t i, const Foo &f, foos)
 cout << "The bar of element " << i << " is " << f.bar() << endl;
</code>

 Is there an easy way to do so?


Why not:

 int index = 0;

 BOOST_FOREACH(const Foo &f, foos)
 {
   // ... stuff ...
   ++index;
 }

?

--
Eric Niebler
BoostPro Computing
http://www.boostpro.com

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


  Hello,

  Thanks for you answer. I'm not sure how to answer the "why not"? The code you write certainly will work, but so would the predecessor to BOOST_FOREACH in the first place, no? So here's my attempt:
1. For shorter loops, this changes 2 LOCs to 5.
2. For longer loops, the iteration code changes its meaning if it appears before the ++index or after.
3. The variable index has scope outside the loop.
4. Other people think so, e.g., the author's of D language http://en.wikipedia.org/wiki/D_(programming_language)#Example_1
  It's true that none of these points is really a proof. Still, I'd be really happy to hack my own INDEX_FOREACH, but the 500+ LOCs of BOOST_FOREACH left me daunted.

  Thanks & Bye,

  TD