
-----Original Message----- From: boost-bounces@lists.boost.org [mailto:boost-bounces@lists.boost.org] On Behalf Of Arkadiy Vertleyb
Hi,
The typeof library defines a macro, REGISTER_TEMPLATE, that is intended for use by the library users. Once people started using the library, they eventually wanted to use this macro inside the Boost PP looping constructs, such as SEQ_FOR_EACH, etc.
Since the implementation of REGISTER_TEMPLATE itself uses quite a few looping constructs, people ran into re-entrancy issues.
Which looping constructs does it use?
I would like the users to be able to use the macro with whichever looping construct they prefer, and, AFAIU, the easiast (only?) way to achieve this would be to limit the macro implementation to only use automatically re-entrant macros, such as BOOST_PP_REPEAT.
That depends. If you can (re)specify the implementation in terms of only one "recursion state" (such as 'z' for REPEAT), then it is best to provide both: #define REGISTER(...) REGISTER_Z(DEDUCE_Z(), ...) #define REGISTER_Z(z, ...) // ... If the implementation requires (or is significantly better using) multiple states, then, yes, you should have it do everything automatically.
Is this the right way to go for this particular case, and generally for any macro that is in the library interface?
That's the general answer. The pp-lib fails to provide a unifying way to deal with recursion, which is why these problems pop up from time to time. Regards, Paul Mensonides