[英]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()
在这种情况下,我从FIRST
到SECOND
缺少了分号。 我试图弄清楚,可以对FIRST
宏进行哪些更改(可能),以便可以在两种情况下进行编译。 我不确定我是否能够正确地解释自己。 有任何想法吗?
您的问题很奇怪。 我强烈建议您不要在实际代码中使用这种怪异的构造。 但是我看着你的问题好像是一个有趣的难题。
潜在解决方案
我认为没有办法通过仅更改First
来使两个语句都编译。 但是,如果将Second
更改为:
#define Second +0,a() / b()
它在两种情况下都可以编译,唯一的条件是结合int
为Objct
定义了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.