0

マクロを使用していくつかの静的変数を作成しようとしています。

私の問題は、2つのパラメーターを使用してマクロを定義するにはどうすればよいかということです。最初のパラメーターはテンプレートで、2番目のパラメーターは静的変数です。テンプレートには複数のタイプが必要です。

例えば:

#define macro(x, y, z, v) x::y z = v;

int main(int argc, char *argv[]) {
  // this works
  macro(std::queue<int>, value_type, test, 4)
  // this also works
  std::pair<int, int>::first_type x = 3;

  // this is produsing some compiler errors
  macro(std::pair<int, int>, first_type, test2, 4)

  return 0;
}

そしてこれを行うことさえ可能ですか?

ここにエラーがあります:

main.cpp(47) : warning C4002: too many actual parameters for macro 'macro'
main.cpp(47) : error C2589: 'int' : illegal token on right side of '::'
main.cpp(47) : error C2589: 'int' : illegal token on right side of '::'
main.cpp(47) : error C2143: syntax error : missing ',' before '::'
main.cpp(50) : error C2143: syntax error : missing ';' before '}'
main.cpp(51) : error C2143: syntax error : missing ';' before '}'

JoachimPileborgに触発されました

#define macro(x, y, z, v, ...) x<__VA_ARGS__>::y z = v;
...

// now it works
macro(std::pair, first_type, test2, 4, int, int)

thx Joachim

4

3 に答える 3

2

これは、マクロを処理するプリプロセッサが非常に愚かだからです。2番目のマクロ「call」に5つの引数があり、最初の引数はで、2番目の引数はstd::pair<intですint>。カンマを含むマクロ引数を持つことはできません。

可変個引数マクロを調べて、クラスがマクロの最後になるように再配置することをお勧めします。

于 2013-03-11T15:06:51.370 に答える
2

これは実際には解決策ではなく、単なる回避策です。

#define COMMA ,

macro(std::pair<int COMMA int>, first_type, test2, 4)

またはもう少し読みやすく:

#define wrap(...) __VA_ARGS__

macro(wrap(std::pair<int, int>), first_type, test2, 4)
于 2013-03-11T15:25:09.070 に答える
2

その最上位のコンマを取り除くには、いくつかの方法があります。

typedef std::pair<int, int> int_pair;
macro(int_pair, first_type, test2, 4)

macro((std::pair<int, int>), first_type, test2, 4);

#define macro2(x1, x2, y, z, v) x1, x2::y z = v;
macro2(std::pair<int, int> first_type, test2, 4)

ちなみに、私;はマクロからを省略し、マクロが使用される場所ならどこでもそれを使用します。これにより、コードがより自然に見えます。

于 2013-03-11T15:29:59.103 に答える