標準のレイアウトメンバー変数にpoinerが提供されている場合、その変数のオフセットを取得したいと思います。offsetof
名前ではなくポインタを持っているので使えません。私が持っている現在のコードはこのように見えます、そして私はdummy
変数を取り除くための標準に準拠した方法があるかどうか疑問に思っています。
template<class T>
struct {
ptrdiff_t get_offset( int (T::*mem) )
{
T dummy;
return reinterpret_cast<char*>(&(dummy.*mem))
- reinterpret_cast<char*>(&dummy);
}
};
int
この関数は、メンバー変数ポイントでのみ呼び出すことができます(これは意図的なものです)。
コンパイラーが実際にdummy
変数を作成しないことは確かですが、それを取り除くことができればそれでもいいでしょう。nullの逆参照が定義されていないため、nullポインターを使用できません(ただし、おそらくすべての一般的なコンパイラーで機能します)。C ++ 03ソリューションが適切であるか、C ++ 11ソリューションも重要です(ただし、現在は使用できません)。
注:これは標準に準拠しているだけであり、Tは標準のレイアウトタイプであることをすでに認識しています。