template<class T, typename U> ptrdiff_t foo(T U::* m)
{
// return offset
}
How I can get the offset of the field 'm' in this context? I would prefer to use am compile-time expression.
Thanks in advance for any help. Best regards
Sounds like you're looking for the offsetof() macro.
@Michael J
Thanks for your answer. This wasn't exactly what I was looking for, but it gives me the inspiration to doing that:
template<class T, typename U>
std::ptrdiff_t member_offset(U T::* member)
{
return reinterpret_cast<std::ptrdiff_t>(
&(reinterpret_cast<T const volatile*>(NULL)->*member)
);
}
The simple answer is that you can't. If the type U is a POD,
you can use the macro offsetof
, but formally, it's undefined
behavior if the type isn't a POD: depending on the compiler,
you'll get a compile time error, or simply wrong results some of
the time. And you can't use it on a pointer to member. You
have to invoke it with the name of the class, and the name of
the member.
来源:https://stackoverflow.com/questions/5617251/offset-of-pointer-to-member