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

2022-01-11 00:00:00 macros c++

考虑一个简单的宏:

#define ECHO(x) x

ECHO(foo(1, 2))

这会产生我们期望的准确输出:

This produces the exact output we expect:

foo(1, 2)

上面的例子有效,因为与函数调用相邻的括号被预处理器识别.

The above example works because the parenthesis adjacent to the function call are recognized by the preprocessor.

现在考虑如果我使用模板而不是函数调用会发生什么:

Now consider what happens if I use a template instead of a function call:

ECHO(template<int, bool>)

这会导致错误,因为预处理器将 template<intbool> 解释为宏的两个单独参数.预处理器无法识别 <> 的作用域!

This causes an error because the preprocessor interprets the template<int and the bool> as two separate arguments to the macro. The preprocessor doesn't recognize <> for scope!

有没有在宏中使用这样的模板?

Is there anyway to use a template like this in a macro?

推荐答案

#define COMMA ,
ECHO(template<int COMMA bool>)

有点痛,但很管用.

FWIW,如果参数的语法允许 ()s,则不需要替换,例如,

FWIW, if the syntax for the argument allows ()s, you don't need the substitution, e.g.,

ECHO((a, b))

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

will work for a single argument macro but that doesn't work in all cases (including yours).

相关文章