これは、テンプレートではありませんが、offsetofマクロを用いるのが定石です。offsetofマクロは<cstddef>ヘッダで定義されますので、(組み込み用などの)自立処理系であっても、必ず提供されることが規格上保証されています(非標準処理系は別ですが)。

仮に、offsetofマクロを自作する必要がある場合、C言語では、

とすれば十分でしたが、C++ではそうはいきません。なぜなら、&演算子が多重定義されている可能性があるからで、正しく動作させるためには、

とする必要があります。

ところで、ここは「C++関数・テンプレート集」であってマクロ集ではないので、やや強引ですが、テンプレート版も作ってみましょう。

引数としてメンバへのポインタを渡すことで、オフセットを返すoffset_of関数テンプレートです。定数式に展開することができないので、offsetofマクロにはどうしても劣りますが、テンプレートの中であれば、利用価値があるかもしれません。

なお、C++11以降であればstd::addressof関数が使えますので、次のように書いてもよいでしょう。

std::addressof関数を使うには<memory>をインクルードしてください。


元ネタ

↑ 構造体に関するテンプレート