宏扩展与模板

时间:2012-11-07 16:04:52

标签: c++ templates macros

我正在编写几个函数,它们将模板函数的结果作为输入:

int alg1(Vect3) {...}
...
int algN(Vect3) {...}

void main() {
    alg1( mat.topRightCorner<3,1>() )
}

其中,如果您感到好奇,topRightCorner会返回mat的子矩阵,这是Eigen中的一种方法,其中维度在编译时已知为模板参数。

然而,使用宏创建一个“快捷方式”以在不同算法之间快速切换(因为在实际代码中,该函数被多次调用),就像这样

#define ALG(X)    ( algN(X) )

ALG( mat.topRightCorner<3,1>() )

给出错误,因为宏已正确展开,但在某种程度上被错误解释为两个不同的参数mat.topRightCorner<31>()

使用括号包装输入可以解决问题,但为什么会出现这种情况?

1 个答案:

答案 0 :(得分:4)

因为预处理器接受,作为新宏参数的分隔符,并且因为预处理器并不真正关心您可能将其视为模板参数列表的分隔符。

稍微更准确一点:

ALG( mat.topRightCorner<3,1>() )
     ^^^^^^^^^^^^^^^^^^^^ ^^^^

这两个词汇看起来都像有效的宏参数,宏解析优先。

另一方面,预处理器知道()的作用,因此您可以通过这种方式“强制”解析为单个参数。