Boost logo

Boost Users :

Subject: [Boost-users] [mpl, preprocessor] Using BOOST_MPL_ASSERT in BOOST_PP_REPEAT
From: Jean-Louis Leroy (jl_at_[hidden])
Date: 2009-11-03 15:30:48


Consider:

#define BOOST_PP_RDB_MPL_ASSERT(z, n, t) \
   BOOST_MPL_ASSERT((BOOST_PP_TUPLE_ELEM( \
   2, 0, t)<BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2, 1, t), n)>));

// in a file passed to BOOST_PP_ITERATE()
BOOST_PP_REPEAT(n, BOOST_PP_RDB_MPL_ASSERT, (is_column_container, Col))

This works with msvc9 express but not with g++ 4.4.1. When I dig it I
see that BOOST_MPL_ASSERT creates an identifier based on
BOOST_MPL_AUX_PP_COUNTER() which in turns uses either __COUNTER__ (with
msvc9) or __LINE__ (with g++). So with g++ we get name clashes when `n`
is greater than one, because the ASSERT macro attempts to create several
variables with the same name in the same scope.

I guess I could copy the code of BOOST_MPL_ASSERT() in my
BOOST_PP_RDB_MPL_ASSERT macro and incorporate `n` in the identifier.

Is there a better solution ?

Thanks,
J-L


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