C++ 使用模板进行宏扩展

C++ 使用模板进行宏扩展,c++,templates,macros,C++,Templates,Macros,我正在编写几个函数,将模板函数的结果作为输入: int alg1(Vect3) {...} ... int algN(Vect3) {...} void main() { alg1( mat.topRightCorner<3,1>() ) } 给出一个错误,因为宏已正确展开,但不知何故被误解为具有两个不同的参数,mat.topRightCorner() 将输入用括号括起来就可以了,但为什么会有这种行为呢?因为,被预处理器接受为新宏参数的分隔符,并且因为预处理器并不真正关心

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

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

void main() {
    alg1( mat.topRightCorner<3,1>() )
}
给出一个错误,因为宏已正确展开,但不知何故被误解为具有两个不同的参数,
mat.topRightCorner()


将输入用括号括起来就可以了,但为什么会有这种行为呢?

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

更准确地说:

ALG( mat.topRightCorner<3,1>() )
     ^^^^^^^^^^^^^^^^^^^^ ^^^^
ALG(mat.topRightCorner())
^^^^^^^^^^^^^^^^^^^^ ^^^^
这两个在词汇上看起来都像有效的宏参数,并且宏解析优先

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

@WhozCraig:
(因为在实际代码中函数被多次调用)
ALG( mat.topRightCorner<3,1>() )
     ^^^^^^^^^^^^^^^^^^^^ ^^^^