如何通过成员绝对指针与成员指针还原C++对象指针?
从成员绝对指针还原对象指针的C++实现方案
原问题场景
先看这段通过对象指针+成员指针获取成员绝对指针的代码:
class X { public: int a { 0 }; int b { 1 }; int c { 2 }; }; X x; X* xptr = &x; int X::* pointer_to_member = &X::b; int* absolute_pointer = &(xptr->*pointer_to_member); // 正向操作:获取成员绝对指针 std::cout << *absolute_pointer << std::endl; // 输出1
现在需要实现逆操作:已知指向类成员的absolute_pointer,以及对应类的成员指针pointer_to_member,如何还原出该成员所属的对象指针?已知可以通过C风格的reinterpret_cast与offsetof实现,但有没有更简洁的官方语言特性或宏?
实现方案与说明
1. 标准合法的实现方式:offsetof + reinterpret_cast
核心逻辑是用成员的绝对地址减去该成员在类中的偏移量,得到对象的起始地址。代码示例如下:
#include <cstddef> #include <iostream> class X { public: int a { 0 }; int b { 1 }; int c { 2 }; }; int main() { X x; X* xptr = &x; int X::* pointer_to_member = &X::b; int* absolute_pointer = &(xptr->*pointer_to_member); // 逆操作:还原对象指针 size_t member_offset = offsetof(X, b); X* restored_obj_ptr = reinterpret_cast<X*>( reinterpret_cast<char*>(absolute_pointer) - member_offset ); // 验证结果 std::cout << restored_obj_ptr->b << std::endl; // 输出1,还原正确 return 0; }
注意:offsetof仅对标准布局类型(Standard Layout Type)的类有效,这类类满足C++标准中关于内存布局的特定规则,保证成员偏移量的计算是可靠的。
2. 是否存在更简洁的官方特性?
目前C++标准中没有专门提供这类逆操作的官方语言特性或宏。
成员指针的设计目标是用于指代类的成员,而非反向推导对象地址,标准库和核心语言特性里没有封装这类逆操作的工具。offsetof是兼容C标准的宏,配合reinterpret_cast是当前标准下最规范、合法的实现方式,虽然带有C风格,但这是标准允许的安全操作(在满足标准布局的前提下)。
内容的提问来源于stack exchange,提问作者Kai Petzke
相关产品推荐
相关产品推荐

