【赤石C++】不使用宏,实现一个“逆序”的成员访问运算符
我们知道,类的成员访问运算符可以用来访问成员变量:object->member
那么,能否实现一个“逆序”的成员访问运算符,使用“逆序“的语法访问成员变量:member<-object
如果你问AI,AI只会教条地回复“无法实现,因为C++不支持自定义运算符”

“逆序”成员访问运算符?
仔细观察<-这个自定义运算符,不难发现,可以被拆分成<和-两个子运算符
在C++中,-运算符优先级高于<,也就是说,member<-object语句的本质就是member < (-object),并不是自创了一个非标准的运算符
分别重载<和-就可以实现这种“黑客”式的语法
实现
先定义一个类,其中包含一个简单的成员变量用于测试
1 | |
首先要重载-,让-object返回自身,使其参与下一步的<操作
1 | |
下面的问题就是如何重载<运算符
已知,C++的重载是基于类型的,不是基于变量值的,也就是说,不能编写这种语法
1 | |
为此,我们添加一个类型标签ReverseTag,并创建一个和成员函数同名的全局变量
1 | |
使用类型标签重载<运算符
1 | |
如此一来,就可以实现“逆序”成员访问运算符
1 | |
其中,该语句的执行逻辑如下:
test_member <- obj语句的本质是test_member < (-obj)- 首先,
-obj调用ReverseMemberOperator& operator-()重载返回自身 - 然后执行
test_member < obj,而这里的test_member是刚才创建的同名全局变量,类型为ReverseTag - 最终调用
int& operator<(ReverseTag, ReverseMemberOperator& obj)重载,并获取真正的成员变量test_member
这逆天的运算符重载技巧,简直是吃到了一口大的
注:如果存在多个成员变量,就需要对每个成员变量分别声明不同的标签
参考
https://github.com/HengXin666/HXTest/blob/main/src/10-cs-code/demo/01-left-ptr/04_left_pptr.cpp
【赤石C++】不使用宏,实现一个“逆序”的成员访问运算符
https://crackme.net/articles/redstone_reverse_member_access/