2

私は挑戦的でありながら単純な問題に苦しんでいます。次のようなターゲット関数があるとしましょう

void target_fnc(int arg1, double arg2)
{ /* do something here */ }

そして、「抽出」したいのは変数名です(つまり、「arg1」、「arg2」)。たとえば、いくつかの前処理で変数のこの情報を取得するのは簡単です

#define PRINTER(name) printer(#name)

void printer(const std::string& name) {cout << name << endl;}

複数の変数がある場合は、可変個引数マクロを使用することもできます

#define PRINTER2(names...) printer(#names)
printer(arg1,arg2)

しかし、ターゲット関数から「抽出」する方法の手がかりがありません..たとえば、次のように可変個引数テンプレート手法を使用します

template <typename ...A>
void extract(void (*)(A...))
{ printer(A...); }

うまくいきません:もちろん、アンパックされた変数ではなく、「A...」を取得します...何かヒントはありますか?

ありがとう!注: C++11、gcc 4.8.1 を使用しています

4

2 に答える 2

0

CPP はコピー アンド ペースト テキスト システムのみです。そのような魔法を行うようには設計されていません。実際、それは愚かな「Xを見たらYを入れる」操作しか行いません。

あなたの場合、可変個パックを反復しようとすると:

inline void print(const std::string& name) { std::cout << name << std::endl; }

#define PRINT(name) print(#name)

//Base case:
void extract() {}

//Recursive case:
template<typename HEAD , typename... TAIL>
void extract(const HEAD& head , const TAIL& tail...)
{
    PRINT(head);

    extract(tail...);
}

あなただけが得ます:





...

答えは次のとおりです。愚かなことに CPP を使用するのは避け、#ifdef #endifヘッダー ガードと移植可能なコンパイルにのみ使用してください。

GET_GREATHER(x,y) ((x) > (y) ? (x) : (y))同様のマクロは含まれていないことに注意してください。C++ には、その歴史の始まり以来、マクロを回避するための強力なツールであるインライン関数があります。

于 2013-07-14T21:13:32.993 に答える