【C++】根据类的成员变量地址获取对象地址

/* 根据一个成员变量的地址获取类对象的地址 */
template
void *GetBaseFromDataMember(data_type class_type::*mem, void* pmem)
{
    union temp{
        data_type class_type::*mem;
        int offset;
    };
    union PtrToInt {
        void *pointer;
        int ipointer;
    };

    temp t = {.mem = mem};                                      /* 获取偏移量 */
    PtrToInt pi2 = {.pointer = pmem};                           /* 获取成员变量的地址 */
    int baseAddr = pi2.ipointer - t.offset;                     /* 获取对象地址 */
    PtrToInt pi3 = {.ipointer = baseAddr};
    return pi3.pointer;                                         /* 返回对象地址 */
}

上面的模板函数,pmem是成员变量的地址,mem是成员变量指针。使用union联合结构,将地址转换为整数值。最后返回对象的地址。

 

如何使用?成员变量必须是public的。

A* pa = (A*)GetBaseFromDataMember(&A::m1, &a->m1);

 

你可能感兴趣的:(C/C++,C++)