【问题标题】:C++ Macros and overloadingC++ 宏和重载
【发布时间】:2016-02-01 22:13:36
【问题描述】:

我正在使用 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()

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

【问题讨论】:

  • 您误解了“lambda”一词。这就是下标或索引。
  • 你忘了说这个的目的。这没有意义。由于不清楚而投票结束。
  • 你的例子都没有显示来自THIRD扩展的分号。
  • 真的很抱歉,我只是想简化我的代码。

标签: c++ c++11 macros operators


【解决方案1】:

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

可能的解决方案

我认为仅通过更改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(). 

【讨论】:

  • 这实际上非常有帮助。工作得很好。我将 Second 更改为 : +1 / a() / b() 并重载 + 运算符以接受 obct + int 以避免代码中的逗号。再次感谢您!
猜你喜欢
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多