4

各引数に対して静的関数を呼び出すマクロがあります。

例えば:

#define FOO(X) X::do();
#define FOO_1(X,Y) X::do(); Y::do();

私の質問は、可変数の引数で foo を使用する必要があるということです。使用することは可能__VA_ARGS__ですか?

以下の行のように:

#define FOO(...) __VA_ARGS__::do() ? 

ありがとう

4

3 に答える 3

1

これを直接行うことはできません。__VA_ARGS__は常に、コンマで区切られたすべてのパラメーターで構成される単一のユニットとして扱われます。プリプロセッサには、パラメーターの数を見つけたり、それらを分離したり、それらをループしたりする組み込みの方法はありません。

同様の質問に対するこの回答は、プリプロセッサを使用した基本的な解決策を示しています。引数リストにいくつの項目があるかを調べ、この正確な量のパラメーターを取るマクロに渡します。

これを行うのではなく、代わりにAndy Prowls C++11 ソリューションを使用するか、コードを再構築して、これがまったく必要ないようにすることをお勧めします。

于 2013-05-04T09:54:47.867 に答える
1

実際には、これを部分的に回避できます。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)SEPERATORBAR(...)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 の使用はお勧めしません。

于 2013-05-04T10:58:25.437 に答える