来自成员引用的 C++ 结构引用
C++ structure reference from member reference
给定以下设置...
struct A {unsigned char _data;};
struct B {unsigned char _data;};
struct C {A a; B b;};
// in this context (ar) is known to be the "a" of some C instance
A& ar = ...;
B& br = get_sister(ar); // the "b" of the same C instance that (ar) belongs to
C& cr = get_parent(ar); // the C instance that (ar) belongs to
...如何在没有 UB(未定义行为)的情况下从 ar
获取 br
和 cr
?
只有当您知道一个事实 ar
正在引用一个 C::a
成员时,您才可以使用 offsetof()
(其中 应该 return 0 在这种情况下,因为 a
是 C
的第一个 non-static 数据成员,但最好不要假设)帮助您访问 C
对象,例如:
C& get_parent(A& ar)
{
return *reinterpret_cast<C*>(reinterpret_cast<char*>(&ar) - offsetof(C, a));
}
B& get_sister(A& ar)
{
return get_parent(ar).b;
}
给定以下设置...
struct A {unsigned char _data;};
struct B {unsigned char _data;};
struct C {A a; B b;};
// in this context (ar) is known to be the "a" of some C instance
A& ar = ...;
B& br = get_sister(ar); // the "b" of the same C instance that (ar) belongs to
C& cr = get_parent(ar); // the C instance that (ar) belongs to
...如何在没有 UB(未定义行为)的情况下从 ar
获取 br
和 cr
?
只有当您知道一个事实 ar
正在引用一个 C::a
成员时,您才可以使用 offsetof()
(其中 应该 return 0 在这种情况下,因为 a
是 C
的第一个 non-static 数据成员,但最好不要假设)帮助您访问 C
对象,例如:
C& get_parent(A& ar)
{
return *reinterpret_cast<C*>(reinterpret_cast<char*>(&ar) - offsetof(C, a));
}
B& get_sister(A& ar)
{
return get_parent(ar).b;
}