使用模板进行宏扩展
macro expansion with templates
本文关键字:扩展 更新时间:2023-10-16
我正在编写几个函数,它们将模板函数的结果作为输入:
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>() )
^^^^^^^^^^^^^^^^^^^^ ^^^^
这两个在词法上看起来都像有效的宏参数,宏解析优先。
另一方面,预处理器知道()
做什么,因此您可以通过这种方式"强制"解析为单个参数。
相关文章:
- 是否可以通过C++扩展强制多个python进程共享同一内存
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 扩展光电二极管探测器以支持多个传感器
- C++中的VLA,扩展名为std=C++11
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++返回 Numpy 数组的 Python 扩展模块
- 扩展可变参数模板中的变量名称
- 扩展C++生成的代码的模板参数类型名称
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- 将元组类型扩展为可变参数模板?
- 如何按文件扩展名引用文件夹中的文件
- HDF5Cpp 扩展复合数据集超板问题
- MSVC中的宏观扩展问题
- 嵌套参数包扩展失败
- C4204:使用的非标准扩展:非常量聚合初始值设定项
- [temp.variadic]中关于包扩展实例化的措辞
- 我应该包含什么来制作 boost.python 扩展?