c++ - 使用模板进行宏扩展

标签 c++ templates macros

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

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

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

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

关于c++ - 使用模板进行宏扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13273498/

相关文章:

macros - 宏观卫生是否只在不同的模块中保护您?

c - Variadic UNUSED 函数/宏

c++ - 检查\n 字符,但之后没有任何内容

c++ - 坏指针 : expression can not be evaluated while parsing tokens

c++ - 如何找到有多少指针指向链表中的特定节点?

c++ - float 的全局格式化选项

c++ - 从模板分配空指针

javascript - 比较两个 URL 模板的优化算法

c++ - 为什么只能在头文件中实现模板?

c - 通过带有类型通知的宏重载 C 中的运算符