質問

ある種のマクロの「オーバーロード」を実行して、MACRO(something) が MACRO(something, else) とは異なる方法で展開されるようにしようとしています。

から取得したスニペットを使用して ここ (100% 移植可能かどうかはわかりません) と Boost PP ライブラリのいくつかの関数を使用して、動作させることができました :D

//THESE TWO COUNT THE NUMBER OF ARGUMENTS
#define VA_NARGS_IMPL(_1, _2, _3, _4, _5, N, ...) N
#define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 5, 4, 3, 2, 1)

//THIS ONE RETURNS THE PARAMETER AT POSITION _i FROM A LIST OF __VA_ARGS__
#define VA_ARG(_i, ...) BOOST_PP_ARRAY_ELEM(_i, (VA_NARGS(__VA_ARGS__), (__VA_ARGS__)))

//AND THIS ONE IS THE 'OVERLOADED' MACRO ;)
#define TEST(...) BOOST_PP_IF(BOOST_PP_EQUAL(1, VA_NARGS(__VA_ARGS__)), function_A(VA_ARG(0, __VA_ARGS__)), \ //1 parameter
                  BOOST_PP_IF(BOOST_PP_EQUAL(2, VA_NARGS(__VA_ARGS__)), function_B(VA_ARG(0, __VA_ARGS__) + VA_ARG(1, __VA_ARGS__)), \ //2 parameters
                  BOOST_PP_IF(BOOST_PP_EQUAL(3, VA_NARGS(__VA_ARGS__)), function_C(VA_ARG(1, __VA_ARGS__) + VA_ARG(2, __VA_ARGS__)), BOOST_PP_EMPTY())) // 3 parameters and so on ...

So       TEST(a) = function_A(a)
      TEST(a, b) = function_B(a + b)
   TEST(a, b, c) = function_C(b + c)

今、私がやりたいことがまだ2つありません。

  1. (これは、私が決して解決しなくても、あまり気にしません) 「バリアント」の数とそれに対応する「出力」を取り上げると、上記のようなコードを生成する MACRO を作成できると思います。上記の例を生成するには、TEMPLATE(3, function_A(...), function_B(...), function_C(...)) のようなものを使用します。

  2. 引数なしで TEST() を呼び出すとどうなりますか?さて、VA_NARGS は 1 に展開されます。ただし、最初の引数は "" (何もありません) です。「ゼロ」引数を検出する方法を見つけようとしています __VA_ARGS__ または、この状況に対応するように「オーバーロード」関数を拡張するために、「null」引数と実際の引数を区別します。何か案は?

役に立ちましたか?

解決

まず、あなたの質問に答えるために2。はい、可変引数マクロでは空の引数リストを検出することも可能です。説明は、私がここにをそれを書かれている、少し長いですに。それはあなたが使用していることをブーストマクロでこのアプローチを組み合わせることが比較的容易である必要があります。

あなたの質問1の場合は、はい、これも可能です。ブーストが近いこれに来るいくつかのイテレータマクロを持って、私が思うに、彼らは使用に少し怖いです。私が正しく理解していれば、あなたはあまりにも便利な、ネストされたリストの(a, (b, (c,d)))のようなものを使用する必要があります。

(私は、より直接的にこれを達成することができますマクロのセットを書きました 残念ながら、パッケージはまだリリースの準備ができていません。プライベートで連絡先を私にあなたがが本当にがそれに興味がある場合。)

編集 P99 のパッケージは平均時間で公開されていますそして「オーバーロードする」と一般的なマクロを入力し、マクロを超える多くのものが含まれています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top