各引数に対して静的関数を呼び出すマクロがあります。
例えば:
#define FOO(X) X::do();
#define FOO_1(X,Y) X::do(); Y::do();
私の質問は、可変数の引数で foo を使用する必要があるということです。使用することは可能__VA_ARGS__
ですか?
以下の行のように:
#define FOO(...) __VA_ARGS__::do() ?
ありがとう
これを直接行うことはできません。__VA_ARGS__
は常に、コンマで区切られたすべてのパラメーターで構成される単一のユニットとして扱われます。プリプロセッサには、パラメーターの数を見つけたり、それらを分離したり、それらをループしたりする組み込みの方法はありません。
同様の質問に対するこの回答は、プリプロセッサを使用した基本的な解決策を示しています。引数リストにいくつの項目があるかを調べ、この正確な量のパラメーターを取るマクロに渡します。
これを行うのではなく、代わりにAndy Prowls C++11 ソリューションを使用するか、コードを再構築して、これがまったく必要ないようにすることをお勧めします。
実際には、これを部分的に回避できます。C++11 の非変数テンプレートまたは可変個引数テンプレートの
すべてのメンバーを直接かつ自由に抽出できます。__VA_ARGS__
しかし、最初の要素を持つことができます。たとえば、という名前のマクロがOUT(...)
あり、 std::cout << A << B << C ... を生成したいとしましょう。ここで、A、B、C はマクロの可変引数です。これを試して:
#include <iostream>
#define SEPERATOR <<
#define GET_1_OF(element1, ...) element1
#define GET_2_OF(element1, ...) element1 SEPERATOR GET_1_OF(__VA_ARGS__)
#define GET_3_OF(element1, ...) element1 SEPERATOR GET_2_OF(__VA_ARGS__)
#define BAR(...) GET_3_OF(__VA_ARGS__)
int main()
{
std::cout << BAR(1,2,3,4,5);
return 0;
}
もちろん、これはあなたが求めている解決策ではありません。ただし、必要なことを行うために GET_N_OF の数を増やすことができます。これは、MACRO などを記述できるようにするためであることに SEPERATOR
注意してください。
さて、このコードには問題があります。で変更してください。エラーが発生していることがわかります。これは、3 つの引数を期待していたためです (可変個引数であるため) より多くの引数を使用しても問題はありませんが、extra があり ます。したがって、 useを使用する代わりにこの問題を解決するには(引数の数がわかっているため):<<
1 << 2 << 3
BAR(1,2,3,4,5)
BAR(1)
SEPERATOR
BAR(...)
GET_N_OF(...)
#include <iostream>
#define SEPERATOR <<
#define GET_1_OF(element1, ...) element1
#define GET_2_OF(element1, ...) element1 SEPERATOR GET_1_OF(__VA_ARGS__)
#define GET_3_OF(element1, ...) element1 SEPERATOR GET_2_OF(__VA_ARGS__)
#define GET_4_OF(element1, ...) element1 SEPERATOR GET_3_OF(__VA_ARGS__)
#define GET_5_OF(element1, ...) element1 SEPERATOR GET_4_OF(__VA_ARGS__)
int main()
{
std::cout << GET_5_OF(1,2,3,4,5);
std::cout << GET_1_OF(1);
return 0;
}
自分が何をしているのかわからない場合は、MACRO をまったく使用しないでください。私の応答は、あなたにとって有益かもしれない楽しい MACRO コードを共有することでした。MACRO が非常に必要になるまでは、MACRO の使用はお勧めしません。