繁体   English   中英

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

它工作正常,因为它已“翻译”为:

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()

它在两种情况下都可以编译,唯一的条件是结合intObjct定义了operator + 如果您设法实现该运算符而没有副作用,那么它甚至会产生您期望的结果。

现场演示

为什么行得通?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM