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)
)));
}
例によって定数式に展開することはできません。なお、厳密にいえば、このようなポインタ演算は未定義の動作を引き起こすことになりますが、現実にはこれで問題ないはずです。
元ネタ
ブックナビゲーション
- 技術情報
- Boost C++ Libraries メモ
- C++と組込み環境
- C++サンプル集
- C++テンプレート集
- C++プログラマのためのC言語入門
- C/C++迷信集
- C99関数・マクロ・前処理スクリプト集
- C言語再入門
- C言語徹底入門
- Drupal メモ
- TOPPERS 情報
- ベターCとしてのC++
- マイコン メモ
- ライブラリ開発入門
- 分割コンパイルをきわめる
- 擬似プロセッサを作る
- 象の卵を探して...
- 車輪の再発明
- 過去の情報

