使用模板进行宏扩展

macro expansion with templates

本文关键字:扩展      更新时间:2023-10-16

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

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>()

用括号包装输入可以解决问题,但为什么会有这种行为呢?

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

更准确地说:

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

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

另一方面,预处理器知道()做什么,因此您可以通过这种方式"强制"解析为单个参数。