アングルブラケットも表す(又はで起こる)ことができるので、比較演算子は<
、>
、<=
および>=
それが括弧内にないように、マクロ展開は、角括弧内のカンマを無視することはできません。(大括弧と中括弧は、通常は対になったペアとして発生しますが、これも問題です。)マクロ引数を括弧で囲むことができます。
FOO((std::map<int, int>), map_var);
その場合、問題はパラメーターがマクロ展開内で括弧で囲まれたままになり、ほとんどのコンテキストで型として読み取られなくなることです。
これを回避するには、C ++では、関数の型を使用して、括弧で囲まれた型名から型名を抽出できます。
template<typename T> struct argument_type;
template<typename T, typename U> struct argument_type<T(U)> { typedef U type; };
#define FOO(t,name) argument_type<void(t)>::type name
FOO((std::map<int, int>), map_var);
関数の型を形成すると余分な括弧が無視されるため、型名にコンマが含まれていない場合に、括弧の有無にかかわらずこのマクロを使用できます。
FOO((int), int_var);
FOO(int, int_var2);
Cではもちろん、型名に括弧の外にコンマを含めることができないため、これは必要ありません。したがって、クロス言語マクロの場合は、次のように記述できます。
#ifdef __cplusplus__
template<typename T> struct argument_type;
template<typename T, typename U> struct argument_type<T(U)> { typedef U type; };
#define FOO(t,name) argument_type<void(t)>::type name
#else
#define FOO(t,name) t name
#endif