Boost.Preprocessor メタプログラムを書いていますが、次の問題があります。次のマクロを検討してください (これは問題を説明するために単純化したものです)。
#define ITERATION_IMPL(p1, p2, p3, p4) ((p1),(p2),(p3),(p4))
#define ITERATION(args) ITERATION_IMPL(hello, args(), world)
#define ARGS() a, b
ITERATION(ARGS)
前処理された出力は次のとおりです。
((hello),(a, b),(world),())
これは、args()
が複数の引数に分割されていないことを示しています。標準に関する私の理解によれば、マクロの引数は置換リストに貼り付けられる前に完全に展開されます。したがって、次の展開シーケンスが期待されます。
ITERATION(ARGS)
ITERATION_IMPL(hello, ARGS(), world)
ITERATION_IMPL(hello, a, b, world)
((hello),(a),(b),(world))
それが私の望む結果です。ITERATION_IMPL
呼び出し自体を変更せずにそれを達成するにはどうすればよいですか?
編集:それが不可能な場合(そして私はそう思う)、CまたはC ++の標準に基づいて説明してください。