5

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

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

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

其中,如果您很好奇,则topRightCorner返回 的子矩阵,这是Eigenmat中的一个方法,当在编译时已知时,维度将作为模板参数放置在其中。

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

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

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

给出一个错误,因为宏被正确扩展但不知何故被误解为具有两个不同的参数,mat.topRightCorner<3并且1>().

用方括号包裹输入就可以了,但是为什么会出现这种行为呢?

4

1 回答 1

5

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

更准确地说:

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

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

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

于 2012-11-07T16:14:34.923 回答