Boost logo

Boost :

From: Paul Mensonides (pmenso57_at_[hidden])
Date: 2003-04-11 16:43:41


Aleksey Gurtovoy wrote:

>> First, though, I want to make sure I understand exactly what you
>> mean. Do you want everything to automatically pick up the default
>> value(s)? Or do you just want a way to signal "use default" to the
>> implementation of the macro in question, such as "MY_MACRO" above?
>
> The latter. Basically, I want something like this (pseudo code):
>
> #define MY_MACRO(n, func) \
> BOOST_PP_IF( \
> BOOST_PP_TOKEN_EQUAL(func, default) \
> , DO_SOMETHING \
> , DO_SOMETHING_WITH_DEFAULT_FUNC \
> )(n) \
> /**/

Without, once again, token-pasting of unrelated tokens, I cannot do this for
_arbitrary_ input. However, I can under certain constraints. If 'func' is +, I
cannot compare it to "default". If func is MY_MACRO, then I can. If you make
the following input constraint: Input is not allowed to be parenthesized, then
you can do it like this:

#define MY_MACRO(n, func) \
    IF( \
        IS_UNARY(func), \
        DO_SOMETHING, \
        DO_SOMETHING_WITH_DEFAULT_FUNC \
    )(n) \
    /**/

Of course, you'd presumably want to actually *use* func for something. Plus,
the above isn't the "best" solution. E.g. this is better:

#define DEFAULT(x, def) \
    IIF( \
        IS_UNARY(x), \
        x,
        def \
    ) \
    /**/

#define MACRO(n, func) \
    DEFAULT(func, DEFAULT_FUNC)(n) \
    /**/
#define DEFAULT_FUNC(n) default

#define FUNC(n) user

MACRO(5, FUNC) // user
MACRO(5, (*) ) // default

P.S. it doesn't matter what is inside the unary parentheses. It could be
(default) or whatever else you might want.

Paul Mensonides


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk