根据类成员地址的偏移获取类指针
template <class P, class M>
size_t my_offsetof(const M P::*member) {
return (size_t) & (reinterpret_cast<P *>(0)->*member);
}
template <class P, class M>
P *my_container_of_impl(M *ptr, const M P::*member) {
return reinterpret_cast<P *>(reinterpret_cast<char *>(ptr) -
my_offsetof(member));
}
//这里的意思是根据成员变量,获取类对象的地址,从而转成当前类对象
#define my_container_of(ptr, type, member) \
my_container_of_impl(ptr, &type::member)
class SpeechListener {
client m_endpoint;
}
void OnOpen(client *c, websocketpp::connection_hdl hdl) {
SpeechListener *listener = my_container_of(c, SpeechListener, m_endpoint);
}
这里主要使用了 零地址转换
#define OFFSET(structure, member) ((int)&((structure*)0)->member);
第二种方式
struct A
{
int i;
char a;
int j;
string str1;
int m;
int n;
};
std::cout << "offset:"<< (size_t) &((A*)0)->str1<<endl;
std::cout << "offset:"<< (size_t) &((A*)0)->m<<endl;
std::cout << "offset:"<< (size_t) &((A*)0)->n<<endl;
string A::*jOffset = &A::str1;
int nJOffSet = (size_t)(*(void**)(&jOffset));