|
|
1
13
如果在语法中添加一组额外的括号,则可以不限制“required”子句的数量,并且宏相对较少:
宏:
使用这些宏,上述示例将扩展为:
解释考虑以下宏:
有了这些,这:
将引起如下膨胀的“连锁反应”:
预处理器中不允许递归,但这种连锁反应不是递归,因为宏的调用只在前一个宏的扩展之后发生,而不是在扩展期间发生,因为
不幸的是,虽然这将很好地循环一系列
然后,我们可以通过定义以下内容简单地去掉最后一个标记:
如果我们不能包装整个列表,就无法知道何时到达最后一个元素。唯一发生的事情是
为什么是两个宏?当我们试图引发如上所述的连锁反应时,只有一个宏像这样:
这行不通:
这是因为“(无限)递归保护”是如何工作的:如果在宏扩展过程中,生成了一个带有被扩展宏名称的标记,则标记为“不可扩展”,这意味着它永远不会再次扩展。看见 http://eel.is/c++draft/cpp.rescan#2
这意味着
|
|
|
2
2
好吧,我想你可以用一个快速的脏东西:
基本上,您需要掌握如何调用宏。
扩展到
扩展到
扩展到
这不是一个完整的答案,但我认为可以作为你想要做什么的起点。 编辑 我现在已经知道如何提高。PP进行迭代,但它并不漂亮,您基本上可以手动写出最大大小的迭代。
在此基础上运行预处理器可获得以下结果:
根据需要。我相信这可以简化一些,但我希望这会有所帮助。 |
|
|
3
0
这是我的2美分: 我记忆中的问题来自Boost中使用的预处理器元编程技术。预处理器是指在折叠序列时,不可能有任意长的元素列表。 您需要有尽可能多的宏作为最大迭代,所以它可以是任意的,但也可以是最大的。 然而,我想知道您是否可以扩展逗号,因为通常这是基于与stop condition宏或next iteration宏旁边的内容连接。我不知道如何从串联的宏中扩展逗号,因为串联将不再起作用。 对于这种情况,如果您可以稍微更改一下API,我会做什么:
因此,通过一个略微改变的API:
它输出了所希望的:
不完全是请求的API,但优点是,由于使用了requires宏,您可以使用带逗号的requires表达式 VA\U参数 :
我努力想把它无限地折叠起来,但看起来我够不着:D。 我没有尝试的是复制与您提供的表达式模板相同的输入语法,这在我看来最终更加可行。 |
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |