从其成员子对象的地址计算对象的地址

时间:2013-12-05 08:30:50

标签: c++ c++11 offset language-lawyer undefined-behavior

我遇到以下情况:

//This is Public
class B{/*usefull stuff*/};
B*f();
void g(B*b)();

//Those classes are only declared the translation unit of f and g.
class Whatever1{/*Implementation details only useful to f and g*/};
class Whatever2{/*Implementation details only useful to f and g*/};
class A{
public:
    Whatever1 w1;
    Whatever2 w2;
    B b;
};

在函数g中,我想将参数(指向B的指针)转换为指向A的指针。

B实例始终包含在A个实例中。

我最终得到了这个:

ptrdiff_t lag(){
    A a;
    return (char*)&a.b-(char*)&a;}

void g(B*b){
    A*a=(A*)((char*)b-lag());
    //Work with a
}

这个解决方案让我非常不舒服。

这样做偏移计算是否100%正确且可移植?

是否会以任何方式触发未定义的行为?

编辑:std :: is_standard_layout< A> ::值为1。

1 个答案:

答案 0 :(得分:2)

如果B中始终包含A,那么在A中添加对B的父级的后向引用可能会更清晰。如果由于某种原因这是不切实际的,那么{{1将它清理一下,但如果有点c-ish,则该方法是有效的。

offsetof