Boost logo

Boost Users :

From: Shunsuke Sogame (mb2act_at_[hidden])
Date: 2006-09-18 19:56:58


Dave Steffen wrote:
> Sebastian Redl writes:
> >
> > On Mon, September 18, 2006 12:52 pm, Rob Caldecott wrote:
> >
> > > Can the pair be declared without a typedef? Is this a limitation of the
> > > MS
> > > compiler?
> >
> > It is a limitation of the preprocessor. It does not recognize <> as any
> > sort of parentheses, so it thinks the , separating the template parameters
> > is a macro argument separator.
> >
> > You can try wrapping the whole argument in parentheses:
> > BOOST_FOREACH((std::pair<int, int> p), m)
> >
> > But I'm not sure if the PP passes the parentheses on - in that case, you
> > might get syntax errors in the generated code. If that's the case, you'll
> > have to use the typedef.
>
> I've done something like this:
>
> #include "boost/tuple/tuple.hpp"
>
> #define FOREACH_PAIR( KEY, VAL, COL) FOREACH (boost::tie(KEY,VAL),COL)
>
> // and then, for example
>
> int key, value;
>
> FOREACH_PAIR(key, value m);
>
> It's not perfect; specfically, I don't think that you can write into
> the map this way. I suspect there _is_ a way for that to work, I just
> haven't figured it out yet. :-)
>
> I'd like the eventual "official" FOREACH to have some additional
> variations like this...

Boost.Parameter(cvs head) seems to already
have a workaround for it.

#include <boost/parameter/aux_/parenthesized_type.hpp>
#define UNPARENTHESIZE BOOST_PARAMETER_PARENTHESIZED_TYPE

int main()
{
     std::map<int, int> m;
     BOOST_FOREACH (
         UNPARENTHESIZE((std::pair<int, int>)) p,
         m )
     {
     }
}

-- 
Shunsuke Sogame

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