4.4 構造体メンバのアドレスから構造体のベースアドレスを逆算する。

次のテンプレートは、メンバを直接指すポインタ ptr と、そのメンバへのポインタ型である pm を与えたとき、構造体へのベースアドレスを返します。

template<class T, class C>
C* base_of(T* ptr, T (C::*pm))
{
  return const_cast<C*>(reinterpret_cast<const volatile C*>((
          reinterpret_cast<const volatile char*>(ptr) - offset_of(pm)
         )));
}

例によって定数式に展開することはできません。なお、厳密にいえば、このようなポインタ演算は未定義の動作を引き起こすことになりますが、現実にはこれで問題ないはずです。


元ネタ
このエントリーを含むはてなブックマーク