3

以前に次の質問をしましたが、この特定のケースでは解決策がうまくいかないようです。

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

4

2 に答える 2

5

最初にマクロを選択してから呼び出すことで、マクロの呼び出しを遅らせることができます。

#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())()

見てみる

呼び出しは、IF呼び出しのないマクロ、または呼び出されたときに引数を破棄するものに展開されます。いずれかが選択された後、最後の括弧は、コンマが邪魔になることなく、必要な引数でそれを呼び出します。

それとは別に、 と に変更しzました。いくつかの部分が重複しているため、ここでより単純なバージョンを見つけることができます。nTIBRA_EATEN_COMMA()EATEN_COMMA

于 2014-07-16T01:15:50.233 に答える