Boost logo

Boost :

Subject: Re: [boost] [Preprocessor] Adding variadic macros support
From: Jeffrey Lee Hellrung, Jr. (jhellrung_at_[hidden])
Date: 2010-11-24 17:45:02

On 11/24/2010 2:14 PM, Edward Diener wrote:
> I am still not sure what you mean by "macro composition" and "argument
> binding" in a preprocessor library. Boost PP has much support for macro
> composition within the context of what it offers in the form of
> repeatable constructs, data types, etc. but I have a feeling you mean
> something else. As far as "argument binding", in terms of preprocessor
> macros all arguments are initially in the form of tokens, so I am not
> sure what you mean by the phrase.

Imagine Boost.MPL without placeholders.

As a simple example, suppose you already have a macro handy:

#define macro( n ) ...insert your favorite expression involving n...

and want to use it in an invocation of BOOST_PP_ENUM. This requires
defining a forwarding macro:

#define macro2( z, n, data ) macro( n )
BOOST_PP_ENUM( N, macro2, ~ )

Argument binding refers to the ability to bind the arguments of
function-style macros to tokens or placeholders for tokens to be
substituted later. So one would be able to do something like (making up
the syntax from what I can remember)

BOOST_PP_ENUM( N, BIND( macro, 2 ), ~ )

where BIND( macro, 2 )( z, n, data ) expands (intermediately) to macro(
n ). The tokens 1, 2, 3, ... are placeholders to be substituted later,
and to bind literal tokens to macro arguments, you wrap them in
parentheses, so that BIND( macro, ( foo ) )( z, n, data ) expands to
macro( foo ).

Using the fictitious BIND macro, you can also compose macros inline,
similar to how Boost.Bind works.

This, at least, is what I remember from browsing through either the
Avalanche code or Paul's Chaos/Order code, I don't remember which. But
I think both basically provide this functionality.

Hopefully that poor and hastily typed explanation helps,

- Jeff

Boost list run by bdawes at, gregod at, cpdaniel at, john at