2014-07-16 33 views
2

我早些时候问过以下问题,但该解决方案在这种情况下似乎不起作用。如何在BOOST_PP_IF中扩展包含逗号的宏

How do I print out a comma multiple times using Boost Preprocessor

我试图展开包含逗号有条件的宏。下面是一个例子示出了该问题:

#define TEST(...)\ 
    BOOST_PP_REPEAT(\ 
     BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), \ 
     MACRO, \ 
     BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__)) 

#define MACRO(z, n, data) BOOST_PP_IF(1,MACRO_CONTAINING_COMMA(z, z),MACRO_CONTAINING_COMMA(z, z)) 

#define MACRO_CONTAINING_COMMA(_NAME, _NAME2) _NAME TIBRA_EATEN_COMMA() _NAME2 

#define EATEN_COMMA BOOST_PP_IF(1,BOOST_PP_COMMA,BOOST_PP_TUPLE_EAT()) 
TEST(1,2,3,4) 

此膨胀以

BOOST_PP_IIF BOOST_PP_IIF BOOST_PP_IIF BOOST_PP_IIF

当它应该扩展到

0,0 1, 1 2,2 3,3

+0

'BOOST_PP_COMMA_IF'有帮助吗? – chris

+0

@chris,这是一个简化的例子,在我的实际代码中'CODE_CONTAINING_COMMA'是一个自定义的'class'声明,所以我不认为'BOOST_PP_COMMA_IF'会帮助很多。 – arman

+1

那么,有一种技术可能也可能有所帮助:http://coliru.stacked-crooked.com/a/b75fdccefcec6b7c – chris

回答

4

可以延迟首先选择它,然后调用它调用您的宏:

#define TEST(...)\ 
    BOOST_PP_REPEAT(\ 
     BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), \ 
     MACRO, \ 
     BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__)) 

#define MACRO(z, n, data) BOOST_PP_IF(1,MACRO_CONTAINING_COMMA,MACRO_CONTAINING_COMMA)(n, n) 

#define MACRO_CONTAINING_COMMA(_NAME, _NAME2) _NAME EATEN_COMMA _NAME2 

#define EATEN_COMMA BOOST_PP_IF(1,BOOST_PP_COMMA,BOOST_PP_TUPLE_EAT())() 

See it work

IF调用扩展为您的宏不被调用时丢弃的参数调用什么的。选择一个后,最后一个括号用所需的参数调用它,而不用逗号。

除此之外,我将z更改为nTIBRA_EATEN_COMMA()EATEN_COMMA。由于某些部件是多余的,您可以找到更简单的版本here

+0

您的示例工作正常,但缺少示例中的“IF”步骤之一。我已经调整了我的问题以使用您的'BOOST_PP_TUPLE_EAT()'建议,但它似乎仍然不起作用。 – arman

+0

对不起,我不是很清楚;我明确地努力定义*我的问题实际上是什么...... – arman

+1

您的新示例在'MACRO'末尾使用一对括号并使用#define MACRO_CONTAINING_COMMA()'工作。随着事情变得更加嵌套,我相信你需要最终有这两件事情,并且任何嵌套的东西选择一个宏来调用。实际上,它也可以在删除EATEN_COMMA()中的圆括号并在第一个IF()后添加一些。 – chris