考虑一个简单的宏:
#define ECHO(x) x
ECHO(foo(1, 2))
Run Code Online (Sandbox Code Playgroud)
这会产生我们期望的确切输出:
foo(1, 2)
Run Code Online (Sandbox Code Playgroud)
上面的示例有效,因为预处理器可以识别与函数调用相邻的括号.
现在考虑如果我使用模板而不是函数调用会发生什么:
ECHO(template<int, bool>)
Run Code Online (Sandbox Code Playgroud)
这会导致错误,因为预处理器会将宏template<int和bool>作为两个单独的参数解释为宏.预处理器无法识别<>范围!
无论如何在宏中使用这样的模板?
smp*_*kes 11
#define COMMA ,
ECHO(template<int COMMA bool>)
Run Code Online (Sandbox Code Playgroud)
有点痛苦,但它的确有效.
FWIW,如果参数的语法允许()s,则不需要替换,例如,
ECHO((a, b))
Run Code Online (Sandbox Code Playgroud)
将适用于单个参数宏,但这并不适用于所有情况(包括你的).
可变参数宏可能有所帮助:
#define ECHO(x...) x
ECHO(foo(1, 2))
ECHO(template<int, bool>)
Run Code Online (Sandbox Code Playgroud)