我正在使用 C++ 宏,试图在特定模式上实现。我有以下 3 个宏:
#define First Objct t; t
#define Second a() / b()
#define Third ;
我以以下格式重载了 lambda-ops:Objct [ Objct ]
所以当我在 main() 中有一行时:
First [ Second ] Third
它工作正常,因为它被“翻译”成:
Objct t; t[a()/b()]
(注意:a()
和 b()
是返回类型对象的虚拟函数。)
困难的部分是,我还必须在没有 lambda 的情况下让它工作。
First Second Third
这意味着
Objct t; t a() / b()
在那种情况下,我从 FIRST
到 SECOND
之间缺少一个分号。我试图弄清楚,可以(可能)对 FIRST
宏进行哪些更改,以便它可以在两种情况下进行编译。
我不确定我是否设法正确地解释了自己。有什么想法吗?
最佳答案
你的问题很奇怪。我强烈建议您不要在实际代码中使用这种奇怪的结构。但我把你的问题当作一个有趣的谜题来看待。
可能的解决方案
我认为没有办法通过仅更改First
来编译这两个语句。但是,如果您将 Second
更改为:
#define Second +0,a() / b()
它在两种情况下都可以编译,唯一的条件是运算符 +
是为 Objct
定义的,并结合了 int
。如果您设法在没有副作用的情况下实现此运算符,它甚至会产生您期望的结果。
为什么有效?
这个定义使用了逗号运算符,唯一的问题是逗号运算符需要两个表达式。 +0 在句法上解决了这个问题,因为单独 +0
是有效的,而 t+0
在满足上述要求的情况下是有效的。
有了这样的定义,First Second Third
被预处理为
Objct t; t +0,a() / b() ; // comma operator evaluates t+0
// then a()/b()
First [Second] Third
将被预处理为
Objct t; t [+0,a() / b()] ; // comma operator makes +0 being evaluated
// and lost and [] is called with value of a()/b().
关于C++ 宏和重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35141406/