在没有括号的宏中使用逗号:如何与模板混合和匹配?

chr*_*ock 8 c++ macros

考虑一个简单的宏:

#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<intbool>作为两个单独的参数解释为宏.预处理器无法识别<>范围!

无论如何在宏中使用这样的模板?

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)

将适用于单个参数宏,但这并不适用于所有情况(包括你的).

  • 请注意,如果你可以包含`"boost/preprocessor/punctuation/comma.hpp",你就有`BOOST_PP_COMMA`.http://www.boost.org/doc/libs/1_31_0/libs/preprocessor/doc/ref/comma.html (2认同)

Yan*_*Yan 5

可变参数宏可能有所帮助:

#define ECHO(x...) x

ECHO(foo(1, 2))
ECHO(template<int, bool>)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这使用GNU扩展.标准(C++ 11)方式是`#define ECHO(...)__ VA_ARGS__`. (2认同)