宏元编程——关系计算——not_equal

在实现not_equal的过程中,利用宏展开不能重入的特性,从而把x和y在相等和不相等的时候映射成不同的宏,再通过把这些宏的值定义成0或1来实现最终的not_equal判断。


#define TL_NOT_EQUAL_0(c, y) TL_IIF(c, TL_NIL, y(1, TL_NIL))
#define TL_NOT_EQUAL_1(c, y) TL_IIF(c, TL_NIL, y(1, TL_NIL))
#define TL_NOT_EQUAL_2(c, y) TL_IIF(c, TL_NIL, y(1, TL_NIL))
#define TL_NOT_EQUAL_3(c, y) TL_IIF(c, TL_NIL, y(1, TL_NIL))
#define TL_NOT_EQUAL_4(c, y) TL_IIF(c, TL_NIL, y(1, TL_NIL))
#define TL_NOT_EQUAL_5(c, y) TL_IIF(c, TL_NIL, y(1, TL_NIL))

定义一系列的宏,TL_NOT_EQUAL_xxx。

用下面的方式调用上面的宏:

TL_NOT_EQUAL_##x(0, TL_NOT_EQUAL_ ## y)

如果x和y相同,举例如果x和y都是2,当用TL_NOT_EQUAL_2(0,TL_NOT_EQUAL_2) 展开后会变成TL_NOT_EQUAL_2(1,TL_NIL)。如果x和y相同展开后结果为TL_NIL

注意:这个地方利用宏展开的一个特性,宏展开遇到同名的宏,会停止展开(可以参看宏元编程)。

然后再把TL_NIL和TL_NOT_EQUAL_2(1,TL_NIL)映射0或1就能判断两个值是否相同。下面是具体实现:

#define TL_NOT_EQUAL_I(x, y) TL_CAT(TL_NOT_EQUAL_CHECK_, TL_CAT(TL_NOT_EQUAL_,x)(0, TL_NOT_EQUAL_ ## y))
#define TL_NOT_EQUAL_CHECK_TL_NIL 1

#define TL_NOT_EQUAL_CHECK_TL_NOT_EQUAL_0(c, y) 0
#define TL_NOT_EQUAL_CHECK_TL_NOT_EQUAL_1(c, y) 0
#define TL_NOT_EQUAL_CHECK_TL_NOT_EQUAL_2(c, y) 0
#define TL_NOT_EQUAL_CHECK_TL_NOT_EQUAL_3(c, y) 0
#define TL_NOT_EQUAL_CHECK_TL_NOT_EQUAL_4(c, y) 0
#define TL_NOT_EQUAL_CHECK_TL_NOT_EQUAL_5(c, y) 0

如果x和y相等,TL_NOT_EQUAL_I(x, y)的最终结果是TL_NOT_EQUAL_CHECK_TL_NOT_EQUAL_x(1, TL_NIL),这些宏值都被定义成0

如果x和y不相等TL_NOT_EQUAL_I(x, y)的最终结果是TL_NOT_EQUAL_CHECK_TL_NIL,值为1


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值