Use offsetoffrom <cstddef>, but be careful, it is determined only by standard types of layouts ( Live at Coliru ):
Data* getBaseDataPtrFromString(std::string* mStringMember) {
static_assert(std::is_standard_layout<Data>::value,
"offsetof() only works on standard-layout types.");
return reinterpret_cast<Data*>(
reinterpret_cast<char*>(mStringMember) - offsetof(Data, b)
);
}
offsetof described in detail in C ++ 11 18.2 / 4:
offsetof (, -) . ( 9), undefined. 195 offsetof (, -) (14.6.2.2 ) (14.6.2.3) , . offsetof , , undefined. , offsetof, , noexcept(offsetof(type, member-designator)) true.
C99 (N1256) 7.17/3:
NULL
, ;
offsetof(type, member-designator)
, size_t, , ( -), ( ), ,
static type t;
&(t. - ) . ( -, undefined.)
" " ++ , offsetof , C.