C++ 宏和重载

C++ Macros and overloading

我正在使用 C++ 宏,试图在特定模式上实现。我有以下 3 个宏:

#define First Objct t; t
#define Second a() / b()
#define Third ;

我已经按照以下格式重载了 lambda-ops:Objct [ Objct ]

所以当我在 main() 中有这样一行时:

First [ Second ] Third

它工作正常,因为它 'translated' 进入:

Objct t; t[a()/b()]

(注意:a()b() 是返回类型对象的虚拟函数。)

困难的部分是我还必须在没有 lambda 的情况下让它工作。

First Second Third

这意味着

Objct t; t a() / b()

在那种情况下,我从 FIRSTSECOND 之间缺少一个分号。我试图弄清楚,可以(可能)对 FIRST 宏进行哪些更改,以便它可以在两种情况下进行编译。 我不确定我是否设法正确地解释了自己。有什么想法吗?

你的问题很奇怪。我强烈建议您不要在实际代码中使用这种奇怪的结构。但我把你的问题当作一个有趣的谜题来看待。

可能的解决方案

我认为没有办法通过仅更改 First 来使这两个语句编译。但是,如果您将 Second 更改为:

#define Second +0,a() / b()

它在两种情况下都可以编译,唯一的条件是运算符 +Objct 定义并与 int 结合使用。如果您设法在没有副作用的情况下实现此运算符,它甚至会产生您期望的结果。

Live demo

为什么有效?

这个定义使用了逗号运算符,唯一的问题是逗号运算符需要两个表达式。 +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().