クラスの複数のバリエーションに展開するには、可変引数マクロを使用する必要があります。マクロ入力に基づいて異なる名前を付ける必要があるため、単純にテンプレートを使用することはできません。問題は、コンマ ( ) 記号を展開できないこと,
と、クラスに複数のパラメーターを取る関数があることです (そのためにはコンマ記号を使用する必要があります)。
boost
コンマに展開されるマクロを提供しますBOOST_PP_COMMA()
が、ループ構成の外でのみ機能します。問題は、BOOST_PP_COMMA()
一度展開されてからカンマとして扱われ、その時点でプログラムが中断することだと思います。
問題を説明するために、変数の数のパラメーターを取り、それに与えられたパラメーターの数に等しい数のコンマを生成するマクロ関数があるとします。単純な解決策は次のとおりです。
#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,BOOST_PP_COMMA(),BOOST_PP_COMMA())\
ただし、コンマが展開され、マクロがパラメーターを分割していると見なすため、これによりさまざまなエラーが発生します。
この問題を回避する方法はありますか?