Thanks I see. I'm at work now and can't test it but would replacing the comma in ARG_PAIR with BOOST_PP_COMMA help?

On Thu, Jul 7, 2016 at 1:49 AM, Edward Diener <eldiener@tropicsoft.com> wrote:
On 7/6/2016 5:27 PM, Cherotek Music wrote:
Hi,
I'm trying to make a macro chain that expands something like this

*A, B, C*

into something like this

*{"A", create<AFile>}, {"B", create<BFile>}, {"C", create<CFile>}*

This is what I have come up with

*#define FORMATS A, B, C // Add new formats here*
*#define SEQ_FORMATS BOOST_PP_VARIADIC_TO_SEQ(FORMATS)*
*#define ARG_PAIR(s, data, x) {#x, create<x##File>}*
*#define SEQ_ARG_PAIRS BOOST_PP_SEQ_TRANSFORM(ARG_PAIR, ~, SEQ_FORMATS)*
*#define ARG_PAIRS BOOST_PP_SEQ_ENUM(SEQ_ARG_PAIRS)*

The SEQ_ARG_PAIRS macro does expand into

*({"A", create<AFile>}) ({"B", create<BFile>}) ({"C", create<CFile>})*

but ARG_PAIRS fails with the following error:

test.cpp:20:1: error: macro "BOOST_PP_SEQ_SIZE_0" passed 2 arguments,
but takes just 1
     ARG_PAIRS
 ^
    BOOST_PP_SEQ_ENUM_0 ({"B", create<BFile>}) ({"C", create<CFile>})
({"A", create<AFile>}) ({"B", create<BFile>}) ({"C", create<CFile>})

Any ideas?

The reason for this is because after your transformation you do not have a valid seq anymore for BOOST_PP_SEQ_ENUM. Each seq element must be a one element tuple. The comma ( ',' ) in each seq element no longer makes that seq element valid, producing a two element tuple. Something like '({"A", create<AFile>})' really containes two elements of data, the first one being '{"A"' and the second one being 'create<AFile>}'.

thanks a lot


_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users