アングルブラケットは、 <
,>
,<=
および>=
のマクロ展開では、カッコ内のように山カッコ内のコンマを無視できません。 (これは、これらは通常、バランスの取れたペアを発生するにもかかわらず、また、角括弧と括弧のための問題です。)あなたは、括弧内のマクロ引数囲むことができます。
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);
関数型を形成することは、余分な括弧を無視するため、このマクロを使用することができますまたはタイプ名がカンマ含まない括弧なし:タイプ名がかっこ外カンマを含めることができないので、Cで
FOO((int), int_var);
FOO(int, int_var2);
が、もちろん、これは必須ではありません。だから、あなたが書くことができ、クロスランゲージマクロ用:
#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
文字をエスケープしてリテラルにする意味があると思います。 – Jite
少なくともC++では、どこにでもtypedefを置くことができるので、なぜそれが "あらかじめ"あるのかは分かりません。 –