$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Tobias Schwinger (tschwinger_at_[hidden])
Date: 2006-01-22 13:43:56
Hi Paul,
thanks for your detailed reply.
Paul Mensonides wrote:
>>-----Original Message-----
>>From: boost-bounces_at_[hidden]
>>[mailto:boost-bounces_at_[hidden]] On Behalf Of Tobias Schwinger
>
>
>>Here are two questions regarding the BOOST_PP_IS_*ARY macros:
>
>
>>Is it safe to use this technique with sequences, e.g.
>>
>> [...]
>
> Yes--with regard to what I say below. Those macros detect "parenthetic
> expressions"--which are non-pathological (see below) sequences of preprocessing
> tokens that begin with something that's parenthesized. E.g. these work also:
> IS_UNARY((+) -) IS_UNARY((+)(not, unary))
Non-pathological means "for every opening parentheses there's a closing one" (I
guess it applies at least to the outer nesting level)? Correct?
>
> What compilers/preprocessors do you usually use?
>
I'm interested in writing compiler independent portable C++ code that works in
practice ;-)...
>
>>And why do these components live in 'detail' (as opposed to
>>'tuple')? Because of Borland?
>
> Because of Borland and others. The problem with these macros is that they don't
> work on several supported compilers. On others, they work, but only sometimes
> (IOW, they are unstable). In the latter case, it isn't just a simple case of
> "if you pass it this, it doesn't work".
Do these problems (besides the ones with BCC) apply to pathological token
sequences only?
> Rather, it is the result of
> fundamentally broken preprocessors that do things in weird orders (probably as
> some sort of optimization scheme). The library can get away with using them
> internally because the library is doing its best to force certain things to
> happen "nearby" where they should happen--and its doing it all over the entire
> library (look at the the VC configuration, for example). The result for client
> use is highly unpredictable because client code doesn't contain the scaffolding
> (the pp-lib bends over backward to minimize the this in user code).
The only two places where is_*ary seem to be used are:
list/adt.hpp
facilities/apply.hpp
I can't see no scaffolding in the VC-case there. Am I looking in the wrong spot?
> On
> reasonably good preprocessors, this isn't a problem at all, and using them is
> perfectly safe and predictable.
>
Would you mind listing the "reasonably good" ones (that is, if there are more on
the list than GNU and Wave)?
>
> Regarding your DO_UNARY-esque macros... They would be more general if they were
> something like:
> [...]
Sorry for picking over-generalized examples (in fact, there was no intention to
provide a general solution). They were intended to illustrate why these IS_*ARY
macros would be a great for (very dedicated and non-generic ;-) ) user code.
I'll leave the design of generic preprocessor components to the experts (although
I definitely feel fascinated by their implementation details).
> BTW, with variadics, you can do all kinds of fun things related to
> optional/default arguments or overloading based on number of arguments. Some
> simple examples...
>
> [... code]
Amazing! Of course I wouldn't ask questions about using IS_*ARY for optional
arguments if all preprocessors would support these extensions. Until then I will
most hopefully find the time for an in-depth study of Chaos!
BTW. are both variadic macros and overloading part of C99?
Thanks,
Tobias