模板的宏展开

5
我正在编写几个函数,它们的输入是模板函数的结果:
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>()

用括号将输入包装起来就会解决问题,但为什么会出现这种情况呢?


@WhozCraig: (因为在实际代码中该函数被调用多次) - Lightness Races in Orbit
1个回答

5
因为预处理器接受逗号作为新宏参数的分隔符,而且预处理器并不关心你可能本意是将其用作模板参数列表的分隔符。
稍微准确地说:
ALG( mat.topRightCorner<3,1>() )
     ^^^^^^^^^^^^^^^^^^^^ ^^^^

这两者在词法上看起来像是有效的宏参数,而宏解析具有优先级。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接