c++ 从指向某个成员的指针获取指向对象的指针

假设有一个结构

struct Thing {
  int a;
  bool b;
};

我得到一个指向该结构的成员b的指针,称为某些函数的参数:

void some_function (bool * ptr) {
  Thing * thing = /* ?? */;
}

如何获取指向包含对象的指针?最重要的是:没有违反标准中的某些规则,那就是我想要标准定义的行为,不是未定义的,也不是实现定义的行为。

作为旁注:我知道这样做避免了类型的安全。

最佳答案
如果你确定指针真的指向结构中的成员b,就像有人做的那样

Thing t;
some_function(&t.b);

那么你应该可以使用offsetof宏来获取一个指向结构的指针:

std::size_t offset = offsetof(Thing, b);
Thing* thing = reinterpret_cast<Thing*>(reinterpret_cast<int8_t*>(ptr) - offset);

注意,如果指针ptr实际上并不指向Thing :: b成员,那么如果使用指针的话,上述代码将导致未定义的行为。

转载注明原文:c++ 从指向某个成员的指针获取指向对象的指针 - 代码日志