C++ 宏和重载

标签 c++ c++11 macros operators

我正在使用 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 宏进行哪些更改,以便它可以在两种情况下进行编译。 我不确定我是否设法正确地解释了自己。有什么想法吗?

最佳答案

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

可能的解决方案

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

关于C++ 宏和重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35141406/

相关文章:

C++ 应用程序控制台未退出

c++ - 重载 [] 但其结果在与其他运算符交互之前未解析 (c++)

c++ - 高效访问矩阵列

c++ - 如何为Winboard制作一个简单的协议(protocol)?

c++ - 根据作用域或非作用域枚举的隐式实例化

c++11 - 动态库加载、模板实例化和 std::shared_ptr

c++ - shared_ptr 和 const 方法线程安全

c++ - 用于将后缀附加到 unsigned long long 文字的宏

c++ - 使用宏访问 C 中的结构成员名称

c - 在 C 中为宏使用预处理器语句