メンバーセレクターでoffsetof
から使用する必要があります。template
厄介な構文を許せば、私は方法を考え出しました:
template <typename T,
typename R,
R T::*M
>
constexpr std::size_t offset_of()
{
return reinterpret_cast<std::size_t>(&(((T*)0)->*M));
};
使用法は完璧ではありません(せいぜい迷惑です):
struct S
{
int x;
int y;
};
static_assert(offset_of<S, int, &S::x>() == 0, "");
static_assert(offset_of<S, int, &S::y>() == sizeof(int), "");
非constexpr
フォームの方が使いやすいです。
template <typename T, typename R>
std::size_t offset_of(R T::*M)
{
return reinterpret_cast<std::size_t>(&(((T*)0)->*M));
};
コンパイル時に実行されないという明らかな欠点があります(ただし、使いやすい):
int main()
{
std::cout << offset_of(&S::x) << std::endl;
std::cout << offset_of(&S::y) << std::endl;
}
私が探しているのは、非多様性のようなconstexpr
構文ですが、それでも完全にコンパイル時です。ただし、その構文を思い付くことができません。(他のタイプの特性と同様に)私も満足しますがoffset_of<&S::x>::value
、その構文の魔法を理解することはできません。