次のテンプレートは、メンバを直接指すポインタptrと、そのメンバへのポインタ型であるpmを与えたとき、構造体へのベースアドレスを返します。
0 1 2 3 4 5 6 7 8 |
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) ))); } |
上記のコードに登場するoffset_ofは「4.1 構造体メンバのオフセットを返す。」で定義した関数です。
なお、厳密にいえば、このようなポインタ演算は未定義の動作を引き起こすことになりますが、現実にはこれで問題ないはずです。