反转指向成员的指针(即获取包含结构的地址)

Rum*_*rak 1 c++ offsetof pointer-to-member c++11

我有一个struct(Member),它只能用作其他struct(Container)中的数据成员.按照惯例,成员的名字总是m.成员是否有可靠的方法来获取包含结构的地址?

template<typename Struct>
struct Member;
{
  const Struct& s = ??;
                    // this - &Struct::m
};

struct Container
{
   Member<Container> m;
};
Run Code Online (Sandbox Code Playgroud)

我希望可能使用指向成员的指针&Container::m可能有助于从Member对象本身的地址计算回来?

Lig*_*ica 5

不,你不能这样做.您可以确定偏移的m范围内Container,做指针运算在产生的地址去猜测Container,但是这将是:

  • 靠不住
  • 容易发生灾难性的错误
  • UB(因此可能导致包括时间旅行在内的症状 - 不,严重!)

如果您已禁用所有优化,它可能会在几个平台上保持一致,但是,真的,请,请不要.

或者传递指针/参考ContainerMember<Container>的构造(加一之后),或进一步重新考虑设计.为什么成员需要知道封装它的对象?这几乎总是错误的(虽然有一些可通过的用例).