【赤石C++】不使用宏,实现一个“逆序”的成员访问运算符

我们知道,类的成员访问运算符可以用来访问成员变量:object->member

那么,能否实现一个“逆序”的成员访问运算符,使用“逆序“的语法访问成员变量:member<-object

如果你问AI,AI只会教条地回复“无法实现,因为C++不支持自定义运算符”

“逆序”成员访问运算符?

仔细观察<-这个自定义运算符,不难发现,可以被拆分成<-两个子运算符

在C++中,-运算符优先级高于<,也就是说,member<-object语句的本质就是member < (-object),并不是自创了一个非标准的运算符

分别重载<-就可以实现这种“黑客”式的语法

实现

先定义一个类,其中包含一个简单的成员变量用于测试

1
2
3
struct ReverseMemberOperator {
int test_member = 114514;
};

首先要重载-,让-object返回自身,使其参与下一步的<操作

1
2
3
4
5
6
7
struct ReverseMemberOperator {
int test_member = 114514;

ReverseMemberOperator& operator-() noexcept {
return *this;
}
};

下面的问题就是如何重载<运算符

已知,C++的重载是基于类型的,不是基于变量值的,也就是说,不能编写这种语法

1
2
3
int& operator<(test_member, ReverseMemberOperator& obj) noexcept {
return test_member;
}

为此,我们添加一个类型标签ReverseTag,并创建一个和成员函数同名的全局变量

1
2
struct ReverseTag {};
constexpr ReverseTag test_member{};

使用类型标签重载<运算符

1
2
3
int& operator<(ReverseTag, ReverseMemberOperator& obj) noexcept {
return obj.test_member;
}

如此一来,就可以实现“逆序”成员访问运算符

1
2
ReverseMemberOperator obj;
int a = test_member <- obj;

其中,该语句的执行逻辑如下:

  1. test_member <- obj语句的本质是test_member < (-obj)
  2. 首先,-obj调用ReverseMemberOperator& operator-()重载返回自身
  3. 然后执行test_member < obj,而这里的test_member是刚才创建的同名全局变量,类型为ReverseTag
  4. 最终调用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/
作者
Brassinolide
发布于
2026年2月2日
许可协议