[英]macro expansion with templates
我正在编写几个函数,它们将模板函数的结果作为输入:
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<3
和1>()
。
使用括号包装输入将起到作用,但为什么会出现这种情况?
因为,
由预处理接受为新的宏参数的分隔符,因为预处理器并不真正关心,你可能有,而不是意味着它作为一个模板参数列表的分隔符。
更准确一点:
ALG( mat.topRightCorner<3,1>() )
^^^^^^^^^^^^^^^^^^^^ ^^^^
这两个词汇看起来都像有效的宏参数,宏解析优先。
另一方面,预处理器知道what ()
作用,因此你可以通过这种方式“强制”解析为单个参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.