将需要逗号的模板传递给单参数宏

P45*_*ent 6 c++ c-preprocessor

我有一些代码基本上可以浓缩为

#define FOO(a)
FOO(std::map<int, int>);
Run Code Online (Sandbox Code Playgroud)

但它会发出编译错误(宏的实际参数太多FOO)。

显然,预处理器认为我已经提供了std::map<intint>作为参数。

有没有办法解决这个问题?预处理器不会以这种方式处理带逗号的带引号的字符串。

Che*_*Alf 2

理想情况下,这应该是注释,但是 SO 不支持注释中的代码,所以,您可以这样做

#include <map>

#define T_ARGS( ... ) < __VA_ARGS__ >

#define FOO( a )  a x;

auto main() -> int
{
    FOO( std::map T_ARGS( int, int ) );
    (void) x;
}
Run Code Online (Sandbox Code Playgroud)

或者您可以定义一个解析为逗号的宏,或者您可以使用特定于某些特定用例的任何方案(例如,单独传递模板名称)。