
"Eric Niebler" <eric@boost-consulting.com> wrote
I suppose you could say that case 2 can always be handled with a set of parens, as in:
BOOST_FOREACH( int i, (some_trait<this,that>::some_list()) )
Therefore, all macro args but the last should be interpreted as part of the loop variable declaration.
I have used the BOOST_FOREACH macro and its ok. As its main raison d'aitre is brevity, why do I need to explicitly provide the loop variable.I would hope for something like: FOREACH(my_container){ std::cout << *_ << '\n'; } IOW the boost::lambda placeholders could be used. Is not foreach a subset of the lambda functionality. (Proponents of lambda always cite this is an example.) I dont know of a reason to require conversions as in the example: short array_short[] = {1,2,3}; BOOST_FOREACH( int i, array_short ) { // The short was implicitly converted to an int } What is the point of the example? FWIW A naive method to do the above is as: #define FOR_EACH(cont) \ for (BOOST_TYPEOF( cont )>::iterator _ = cont ## .begin();\ _ != cont ## .end();\ ++ _ ) exept require *_ as opposed to _ However maybe this is an advantage... because the iterator is exposed then more loop information is avaialable eg if _ == my_container::begin() etc., which is an advantage over simply having the element available so making things more versatile. regards Andy Little